Skip to content

Commit c54fb30

Browse files
authored
Refactor symbol define and use static operator() (#142)
1 parent 4a2293e commit c54fb30

File tree

15 files changed

+380
-309
lines changed

15 files changed

+380
-309
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ val androidTargetSdkVersion by extra(35)
66
val androidMinSdkVersion by extra(21)
77
val androidBuildToolsVersion by extra("35.0.0")
88
val androidCompileSdkVersion by extra(35)
9-
val androidNdkVersion by extra("27.0.12077973")
9+
val androidNdkVersion by extra("28.0.13004108")
1010
val androidCmakeVersion by extra("3.28.0+")

lsplant/src/main/jni/art/mirror/class.cxx

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,11 @@ namespace lsplant::art::mirror {
1616

1717
export class Class {
1818
private:
19-
inline static MemberFunction<
20-
"_ZN3art6mirror5Class13GetDescriptorEPNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE",
21-
Class, const char *(std::string *)>
22-
GetDescriptor_;
19+
inline static auto GetDescriptor_ =
20+
"_ZN3art6mirror5Class13GetDescriptorEPNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE"_sym.as<const char *(Class::*)(std::string *)>;
2321

24-
inline static MemberFunction<"_ZN3art6mirror5Class11GetClassDefEv", Class,
25-
const dex::ClassDef *()>
26-
GetClassDef_;
22+
inline static auto GetClassDef_ =
23+
"_ZN3art6mirror5Class11GetClassDefEv"_sym.as<const dex::ClassDef *(Class::*)()>;
2724

2825
using BackupMethods = phmap::flat_hash_map<art::ArtMethod *, void *>;
2926
inline static phmap::flat_hash_map<const art::Thread *,
@@ -62,41 +59,44 @@ export class Class {
6259
}
6360
}
6461

65-
inline static Hooker<
66-
"_ZN3art6mirror5Class9SetStatusENS_6HandleIS1_EENS_11ClassStatusEPNS_6ThreadE",
67-
void(TrivialHandle<Class>, uint8_t, Thread *)>
68-
SetClassStatus_ = +[](TrivialHandle<Class> h, uint8_t new_status, Thread *self) {
62+
inline static auto SetClassStatus_ =
63+
"_ZN3art6mirror5Class9SetStatusENS_6HandleIS1_EENS_11ClassStatusEPNS_6ThreadE"_sym.hook->*[]
64+
<Backup auto backup>
65+
(TrivialHandle<Class> h, uint8_t new_status, Thread *self) static -> void {
6966
if (new_status == initialized_status) {
7067
BackupClassMethods(GetClassDef_(h.Get()), self);
7168
}
72-
return SetClassStatus_(h, new_status, self);
69+
return backup(h, new_status, self);
7370
};
7471

75-
inline static Hooker<"_ZN3art6mirror5Class9SetStatusENS_6HandleIS1_EENS1_6StatusEPNS_6ThreadE",
76-
void(Handle<Class>, int, Thread *)>
77-
SetStatus_ = +[](Handle<Class> h, int new_status, Thread *self) {
72+
inline static auto SetStatus_ =
73+
"_ZN3art6mirror5Class9SetStatusENS_6HandleIS1_EENS1_6StatusEPNS_6ThreadE"_sym.hook->*[]
74+
<Backup auto backup>
75+
(Handle<Class> h, int new_status, Thread *self) static -> void {
7876
if (new_status == static_cast<int>(initialized_status)) {
7977
BackupClassMethods(GetClassDef_(h.Get()), self);
8078
}
81-
return SetStatus_(h, new_status, self);
79+
return backup(h, new_status, self);
8280
};
8381

84-
inline static Hooker<"_ZN3art6mirror5Class9SetStatusENS_6HandleIS1_EENS1_6StatusEPNS_6ThreadE",
85-
void(TrivialHandle<Class>, uint32_t, Thread *)>
86-
TrivialSetStatus_ = +[](TrivialHandle<Class> h, uint32_t new_status, Thread *self) {
82+
inline static auto TrivialSetStatus_ =
83+
"_ZN3art6mirror5Class9SetStatusENS_6HandleIS1_EENS1_6StatusEPNS_6ThreadE"_sym.hook->*[]
84+
<Backup auto backup>
85+
(TrivialHandle<Class> h, uint32_t new_status, Thread *self) static -> void {
8786
if (new_status == initialized_status) {
8887
BackupClassMethods(GetClassDef_(h.Get()), self);
8988
}
90-
return TrivialSetStatus_(h, new_status, self);
89+
return backup(h, new_status, self);
9190
};
9291

93-
inline static Hooker<"_ZN3art6mirror5Class9SetStatusENS1_6StatusEPNS_6ThreadE",
94-
void(Class *, int, Thread *)>
95-
ClassSetStatus_ = +[](Class *thiz, int new_status, Thread *self) {
92+
inline static auto ClassSetStatus_ =
93+
"_ZN3art6mirror5Class9SetStatusENS1_6StatusEPNS_6ThreadE"_sym.hook->*[]
94+
<MemBackup auto backup>
95+
(Class *thiz, int new_status, Thread *self) static -> void {
9696
if (new_status == static_cast<int>(initialized_status)) {
9797
BackupClassMethods(GetClassDef_(thiz), self);
9898
}
99-
return ClassSetStatus_(thiz, new_status, self);
99+
return backup(thiz, new_status, self);
100100
};
101101

102102
public:

lsplant/src/main/jni/art/runtime/art_method.cxx

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -17,30 +17,26 @@ class Class;
1717
}
1818

1919
export class ArtMethod {
20-
inline static MemberFunction<"_ZN3art9ArtMethod12PrettyMethodEPS0_b", ArtMethod,
21-
std::string(bool)>
22-
PrettyMethod_;
23-
24-
inline static Function<"_ZN3art12PrettyMethodEPNS_9ArtMethodEb",
25-
std::string(ArtMethod *thiz, bool with_signature)>
26-
PrettyMethodStatic_;
27-
28-
inline static Function<"_ZN3art12PrettyMethodEPNS_6mirror9ArtMethodEb",
29-
std::string(ArtMethod *thiz, bool with_signature)>
30-
PrettyMethodMirror_;
31-
32-
inline static Function<"_ZN3artL15GetMethodShortyEP7_JNIEnvP10_jmethodID",
33-
const char *(JNIEnv *env, jmethodID method)>
34-
GetMethodShortyL_;
35-
inline static Function<"_ZN3art15GetMethodShortyEP7_JNIEnvP10_jmethodID",
36-
const char *(JNIEnv *env, jmethodID mid)>
37-
GetMethodShorty_;
38-
39-
inline static MemberFunction<"_ZN3art9ArtMethod24ThrowInvocationTimeErrorEv", ArtMethod, void()>
40-
ThrowInvocationTimeError_;
41-
42-
inline static Function<"artInterpreterToCompiledCodeBridge", void()>
43-
art_interpreter_to_compiled_code_bridge_;
20+
inline static auto PrettyMethod_ =
21+
"_ZN3art9ArtMethod12PrettyMethodEPS0_b"_sym.as<std::string(ArtMethod::*)(bool)>;
22+
23+
inline static auto PrettyMethodStatic_ =
24+
"_ZN3art12PrettyMethodEPNS_9ArtMethodEb"_sym.as<std::string(ArtMethod *thiz, bool with_signature)>;
25+
26+
inline static auto PrettyMethodMirror_ =
27+
"_ZN3art12PrettyMethodEPNS_6mirror9ArtMethodEb"_sym.as<std::string(ArtMethod *thiz, bool with_signature)>;
28+
29+
inline static auto GetMethodShortyL_ =
30+
"_ZN3artL15GetMethodShortyEP7_JNIEnvP10_jmethodID"_sym.as<const char *(JNIEnv *env, jmethodID method)>;
31+
32+
inline static auto GetMethodShorty_ =
33+
"_ZN3art15GetMethodShortyEP7_JNIEnvP10_jmethodID"_sym.as<const char *(JNIEnv *env, jmethodID mid)>;
34+
35+
inline static auto ThrowInvocationTimeError_ =
36+
"_ZN3art9ArtMethod24ThrowInvocationTimeErrorEv"_sym.as<void(ArtMethod::*)()>;
37+
38+
inline static auto art_interpreter_to_compiled_code_bridge_ =
39+
"artInterpreterToCompiledCodeBridge"_sym.as<void()>;
4440

4541
inline void ThrowInvocationTimeError() {
4642
if (ThrowInvocationTimeError_) {

lsplant/src/main/jni/art/runtime/class_linker.cxx

Lines changed: 87 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -17,28 +17,27 @@ import runtime;
1717
namespace lsplant::art {
1818
export class ClassLinker {
1919
private:
20-
inline static MemberFunction<
21-
"_ZNK3art11ClassLinker27SetEntryPointsToInterpreterEPNS_9ArtMethodE", ClassLinker,
22-
void(ArtMethod *)>
23-
SetEntryPointsToInterpreter_;
24-
25-
inline static Hooker<"_ZN3art11ClassLinker30ShouldUseInterpreterEntrypointEPNS_9ArtMethodEPKv",
26-
bool(ArtMethod *, const void *)>
27-
ShouldUseInterpreterEntrypoint_ = +[](ArtMethod *art_method, const void *quick_code) {
20+
inline static auto SetEntryPointsToInterpreter_ =
21+
"_ZNK3art11ClassLinker27SetEntryPointsToInterpreterEPNS_9ArtMethodE"_sym.as<void(ClassLinker::*)(ArtMethod *)>;
22+
23+
inline static auto ShouldUseInterpreterEntrypoint_ =
24+
"_ZN3art11ClassLinker30ShouldUseInterpreterEntrypointEPNS_9ArtMethodEPKv"_sym.hook->*[]
25+
<Backup auto backup>
26+
(ArtMethod *art_method, const void *quick_code)static -> bool {
2827
if (quick_code != nullptr && IsHooked(art_method)) [[unlikely]] {
2928
return false;
3029
}
31-
return ShouldUseInterpreterEntrypoint_(art_method, quick_code);
30+
return backup(art_method, quick_code);
3231
};
3332

34-
inline static Function<"art_quick_to_interpreter_bridge", void(void *)>
35-
art_quick_to_interpreter_bridge_;
33+
inline static auto art_quick_to_interpreter_bridge_ =
34+
"art_quick_to_interpreter_bridge"_sym.as<void(void *)>;
3635

37-
inline static Function<"_ZN3art15instrumentationL19GetOptimizedCodeForEPNS_9ArtMethodE",
38-
void *(ArtMethod *)> GetOptimizedCodeFor_;
36+
inline static auto GetOptimizedCodeFor_ =
37+
"_ZN3art15instrumentationL19GetOptimizedCodeForEPNS_9ArtMethodE"_sym.as<void *(ArtMethod *)>;
3938

40-
inline static MemberFunction<"_ZNK3art11ClassLinker29GetRuntimeQuickGenericJniStubEv",
41-
ClassLinker, void *()> GetRuntimeQuickGenericJniStub_;
39+
inline static auto GetRuntimeQuickGenericJniStub_=
40+
"_ZNK3art11ClassLinker29GetRuntimeQuickGenericJniStubEv"_sym.as<void *(ClassLinker::*)()>;
4241

4342
inline static art::ArtMethod *MayGetBackup(art::ArtMethod *method) {
4443
if (auto backup = IsHooked(method); backup) [[unlikely]] {
@@ -48,57 +47,60 @@ export class ClassLinker {
4847
return method;
4948
}
5049

51-
inline static MemberHooker<"_ZN3art6mirror9ArtMethod14RegisterNativeEPNS_6ThreadEPKvb",
52-
ClassLinker, void(ArtMethod *, Thread *, const void *, bool)>
53-
RegisterNativeThread_ = +[](ClassLinker *thiz, ArtMethod *method, Thread *thread,
54-
const void *native_method, bool is_fast) {
55-
return RegisterNativeThread_(thiz, MayGetBackup(method), thread, native_method,
56-
is_fast);
50+
inline static auto RegisterNativeThread_ =
51+
"_ZN3art6mirror9ArtMethod14RegisterNativeEPNS_6ThreadEPKvb"_sym.hook->*[]
52+
<MemBackup auto backup>
53+
(ClassLinker *thiz, ArtMethod *method, Thread *thread, const void *native_method, bool is_fast) static -> void {
54+
return backup(thiz, MayGetBackup(method), thread, native_method, is_fast);
55+
};
56+
57+
inline static auto UnregisterNativeThread_ =
58+
"_ZN3art6mirror9ArtMethod16UnregisterNativeEPNS_6ThreadE"_sym.hook->*[]
59+
<MemBackup auto backup>
60+
(ClassLinker *thiz, ArtMethod *method, Thread *thread) static -> void {
61+
return backup(thiz, MayGetBackup(method), thread);
5762
};
5863

59-
inline static MemberHooker<"_ZN3art6mirror9ArtMethod16UnregisterNativeEPNS_6ThreadE",
60-
ClassLinker, void(ArtMethod *, Thread *)>
61-
UnregisterNativeThread_ = +[](ClassLinker *thiz, ArtMethod *method, Thread *thread) {
62-
return UnregisterNativeThread_(thiz, MayGetBackup(method), thread);
64+
inline static auto RegisterNativeFast_ =
65+
"_ZN3art9ArtMethod14RegisterNativeEPKvb"_sym.hook->*[]
66+
<MemBackup auto backup>
67+
(ClassLinker *thiz, ArtMethod *method, const void *native_method, bool is_fast) static -> void {
68+
return backup(thiz, MayGetBackup(method), native_method, is_fast);
6369
};
6470

65-
inline static MemberHooker<"_ZN3art9ArtMethod14RegisterNativeEPKvb", ClassLinker,
66-
void(ArtMethod *, const void *, bool)>
67-
RegisterNativeFast_ =
68-
+[](ClassLinker *thiz, ArtMethod *method, const void *native_method, bool is_fast) {
69-
return RegisterNativeFast_(thiz, MayGetBackup(method), native_method, is_fast);
70-
};
71-
72-
inline static MemberHooker<"_ZN3art9ArtMethod16UnregisterNativeEv", ClassLinker,
73-
void(ArtMethod *)>
74-
UnregisterNativeFast_ = +[](ClassLinker *thiz, ArtMethod *method) {
75-
return UnregisterNativeFast_(thiz, MayGetBackup(method));
71+
inline static auto UnregisterNativeFast_ =
72+
"_ZN3art9ArtMethod16UnregisterNativeEv"_sym.hook->*[]
73+
<MemBackup auto backup>
74+
(ClassLinker *thiz, ArtMethod *method) static -> void{
75+
return backup(thiz, MayGetBackup(method));
7676
};
7777

78-
inline static MemberHooker<"_ZN3art9ArtMethod14RegisterNativeEPKv", ClassLinker,
79-
const void *(ArtMethod *, const void *)>
80-
RegisterNative_ = +[](ClassLinker *thiz, ArtMethod *method, const void *native_method) {
81-
return RegisterNative_(thiz, MayGetBackup(method), native_method);
78+
inline static auto RegisterNative_ =
79+
"_ZN3art9ArtMethod14RegisterNativeEPKv"_sym.hook->*[]
80+
<MemBackup auto backup>
81+
(ClassLinker *thiz, ArtMethod *method, const void *native_method) static -> const void * {
82+
return backup(thiz, MayGetBackup(method), native_method);
8283
};
8384

84-
inline static MemberHooker<"_ZN3art9ArtMethod16UnregisterNativeEv", ClassLinker,
85-
const void *(ArtMethod *)>
86-
UnregisterNative_ = +[](ClassLinker *thiz, ArtMethod *method) {
87-
return UnregisterNative_(thiz, MayGetBackup(method));
85+
inline static auto UnregisterNative_ =
86+
"_ZN3art9ArtMethod16UnregisterNativeEv"_sym.hook->*[]
87+
<MemBackup auto backup>
88+
(ClassLinker *thiz, ArtMethod *method) static -> const void * {
89+
return backup(thiz, MayGetBackup(method));
8890
};
8991

90-
inline static MemberHooker<
91-
"_ZN3art11ClassLinker14RegisterNativeEPNS_6ThreadEPNS_9ArtMethodEPKv", ClassLinker,
92-
const void *(Thread *, ArtMethod *, const void *)>
93-
RegisterNativeClassLinker_ =
94-
+[](ClassLinker *thiz, Thread *self, ArtMethod *method, const void *native_method) {
95-
return RegisterNativeClassLinker_(thiz, self, MayGetBackup(method), native_method);
96-
};
97-
98-
inline static MemberHooker<"_ZN3art11ClassLinker16UnregisterNativeEPNS_6ThreadEPNS_9ArtMethodE",
99-
ClassLinker, const void *(Thread *, ArtMethod *)>
100-
UnregisterNativeClassLinker_ = +[](ClassLinker *thiz, Thread *self, ArtMethod *method) {
101-
return UnregisterNativeClassLinker_(thiz, self, MayGetBackup(method));
92+
inline static auto RegisterNativeClassLinker_ =
93+
"_ZN3art11ClassLinker14RegisterNativeEPNS_6ThreadEPNS_9ArtMethodEPKv"_sym.hook->*[]
94+
<MemBackup auto backup>
95+
(ClassLinker *thiz, Thread *self, ArtMethod *method, const void *native_method) static -> const void *{
96+
return backup(thiz, self, MayGetBackup(method), native_method);
97+
};
98+
99+
inline static auto UnregisterNativeClassLinker_ =
100+
"_ZN3art11ClassLinker16UnregisterNativeEPNS_6ThreadEPNS_9ArtMethodE"_sym.hook->*[]
101+
<MemBackup auto backup>
102+
(ClassLinker *thiz, Thread *self, ArtMethod *method) static -> const void * {
103+
return backup(thiz, self, MayGetBackup(method));
102104
};
103105

104106
static void RestoreBackup(const dex::ClassDef *class_def, art::Thread *self) {
@@ -123,44 +125,44 @@ export class ClassLinker {
123125
}
124126
}
125127

126-
inline static MemberHooker<
127-
"_ZN3art11ClassLinker22FixupStaticTrampolinesENS_6ObjPtrINS_6mirror5ClassEEE", ClassLinker,
128-
void(ObjPtr<mirror::Class>)>
129-
FixupStaticTrampolines_ = +[](ClassLinker *thiz, ObjPtr<mirror::Class> mirror_class) {
130-
FixupStaticTrampolines_(thiz, mirror_class);
128+
inline static auto FixupStaticTrampolines_ =
129+
"_ZN3art11ClassLinker22FixupStaticTrampolinesENS_6ObjPtrINS_6mirror5ClassEEE"_sym.hook->*[]
130+
<MemBackup auto backup>
131+
(ClassLinker *thiz, ObjPtr<mirror::Class> mirror_class) static -> void {
132+
backup(thiz, mirror_class);
131133
RestoreBackup(mirror_class->GetClassDef(), nullptr);
132134
};
133135

134-
inline static MemberHooker<
135-
"_ZN3art11ClassLinker22FixupStaticTrampolinesEPNS_6ThreadENS_6ObjPtrINS_6mirror5ClassEEE",
136-
ClassLinker, void(Thread *, ObjPtr<mirror::Class>)>
137-
FixupStaticTrampolinesWithThread_ =
138-
+[](ClassLinker *thiz, Thread *self, ObjPtr<mirror::Class> mirror_class) {
139-
FixupStaticTrampolinesWithThread_(thiz, self, mirror_class);
140-
RestoreBackup(mirror_class->GetClassDef(), self);
141-
};
142-
143-
inline static MemberHooker<"_ZN3art11ClassLinker22FixupStaticTrampolinesEPNS_6mirror5ClassE",
144-
ClassLinker, void(mirror::Class *)>
145-
FixupStaticTrampolinesRaw_ = +[](ClassLinker *thiz, mirror::Class *mirror_class) {
146-
FixupStaticTrampolinesRaw_(thiz, mirror_class);
136+
inline static auto FixupStaticTrampolinesWithThread_ =
137+
"_ZN3art11ClassLinker22FixupStaticTrampolinesEPNS_6ThreadENS_6ObjPtrINS_6mirror5ClassEEE"_sym.hook->*[]
138+
<MemBackup auto backup>
139+
(ClassLinker *thiz, Thread *self, ObjPtr<mirror::Class> mirror_class) static -> void {
140+
backup(thiz, self, mirror_class);
141+
RestoreBackup(mirror_class->GetClassDef(), self);
142+
};
143+
144+
inline static auto FixupStaticTrampolinesRaw_ =
145+
"_ZN3art11ClassLinker22FixupStaticTrampolinesEPNS_6mirror5ClassE"_sym.hook->*[]
146+
<MemBackup auto backup>
147+
(ClassLinker *thiz, mirror::Class *mirror_class)static -> void {
148+
backup(thiz, mirror_class);
147149
RestoreBackup(mirror_class->GetClassDef(), nullptr);
148150
};
149151

150-
inline static MemberHooker<
151-
{"_ZN3art11ClassLinker26VisiblyInitializedCallback29AdjustThreadVisibilityCounterEPNS_6ThreadEi",
152-
"_ZN3art11ClassLinker26VisiblyInitializedCallback29AdjustThreadVisibilityCounterEPNS_6ThreadEl"},
153-
ClassLinker, void(Thread *, ssize_t)>
154-
AdjustThreadVisibilityCounter_ = +[](ClassLinker *thiz, Thread *self, ssize_t adjustment) {
155-
AdjustThreadVisibilityCounter_(thiz, self, adjustment);
152+
inline static auto AdjustThreadVisibilityCounter_ =
153+
("_ZN3art11ClassLinker26VisiblyInitializedCallback29AdjustThreadVisibilityCounterEPNS_6ThreadEi"_sym |
154+
"_ZN3art11ClassLinker26VisiblyInitializedCallback29AdjustThreadVisibilityCounterEPNS_6ThreadEl"_sym).hook->*[]
155+
<MemBackup auto backup>
156+
(ClassLinker *thiz, Thread *self, ssize_t adjustment) static -> void {
157+
backup(thiz, self, adjustment);
156158
RestoreBackup(nullptr, self);
157159
};
158160

159-
inline static MemberHooker<
160-
"_ZN3art11ClassLinker26VisiblyInitializedCallback22MarkVisiblyInitializedEPNS_6ThreadE",
161-
ClassLinker, void(Thread *)>
162-
MarkVisiblyInitialized_ = +[](ClassLinker *thiz, Thread *self) {
163-
MarkVisiblyInitialized_(thiz, self);
161+
inline static auto MarkVisiblyInitialized_ =
162+
"_ZN3art11ClassLinker26VisiblyInitializedCallback22MarkVisiblyInitializedEPNS_6ThreadE"_sym.hook->*[]
163+
<MemBackup auto backup>
164+
(ClassLinker *thiz, Thread *self) static -> void {
165+
backup(thiz, self);
164166
RestoreBackup(nullptr, self);
165167
};
166168

0 commit comments

Comments
 (0)