[-]
[+]
|
Changed |
_service:tar_git:libhybris.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:libhybris.spec
^
|
|
[-]
[+]
|
Changed |
_service:tar_git:libhybris-0.0.5.31.tar.bz2/libhybris/hybris/common/hooks.c
^
|
@@ -93,9 +93,9 @@
static hybris_hook_cb hook_callback = NULL;
#ifdef WANT_ARM_TRACING
-static void (*_android_linker_init)(int sdk_version, void* (*get_hooked_symbol)(const char*, const char*), void *(_create_wrapper)(const char*, void*, int)) = NULL;
+static void (*_android_linker_init)(int sdk_version, void* (*get_hooked_symbol)(const char*, const char*), int enable_linker_gdb_support, void *(_create_wrapper)(const char*, void*, int)) = NULL;
#else
-static void (*_android_linker_init)(int sdk_version, void* (*get_hooked_symbol)(const char*, const char*)) = NULL;
+static void (*_android_linker_init)(int sdk_version, void* (*get_hooked_symbol)(const char*, const char*), int enable_linker_gdb_support) = NULL;
#endif
void *(*_android_dlopen)(const char* filename, int flag) = NULL;
@@ -3180,6 +3180,14 @@
static void __hybris_linker_init()
{
LOGD("Linker initialization");
+
+ int enable_linker_gdb_support = 0;
+ const char *env = getenv("HYBRIS_ENABLE_LINKER_DEBUG_MAP");
+ if (env != NULL) {
+ if (strcmp(env, "1") == 0) {
+ enable_linker_gdb_support = 1;
+ }
+ }
int sdk_version = get_android_sdk_version();
@@ -3207,7 +3215,11 @@
#endif
const char *linker_dir = LINKER_PLUGIN_DIR;
- const char *user_linker_dir = getenv("HYBRIS_LINKER_DIR");
+ /* getauxval to make sure users cannot load custom libraries into
+ * setuid processes */
+ const char *user_linker_dir = getauxval(AT_SECURE) ?
+ NULL :
+ getenv("HYBRIS_LINKER_DIR");
if (user_linker_dir)
linker_dir = user_linker_dir;
@@ -3241,9 +3253,9 @@
/* Now its time to setup the linker itself */
#ifdef WANT_ARM_TRACING
- _android_linker_init(sdk_version, __hybris_get_hooked_symbol, create_wrapper);
+ _android_linker_init(sdk_version, __hybris_get_hooked_symbol, enable_linker_gdb_support, create_wrapper);
#else
- _android_linker_init(sdk_version, __hybris_get_hooked_symbol);
+ _android_linker_init(sdk_version, __hybris_get_hooked_symbol, enable_linker_gdb_support);
#endif
if (_android_set_application_target_sdk_version) {
|
[-]
[+]
|
Changed |
_service:tar_git:libhybris-0.0.5.31.tar.bz2/libhybris/hybris/common/jb/linker.c
^
|
@@ -166,14 +166,18 @@
*/
extern void __attribute__((noinline)) rtld_db_dlactivity(void);
-static struct r_debug _r_debug = {1, NULL, &rtld_db_dlactivity,
+struct r_debug _r_debug = {1, NULL, &rtld_db_dlactivity,
RT_CONSISTENT, 0};
static struct link_map *r_debug_tail = 0;
static pthread_mutex_t _r_debug_lock = PTHREAD_MUTEX_INITIALIZER;
+static int _linker_enable_gdb_support = 0;
+
static void insert_soinfo_into_debug_map(soinfo * info)
{
+ if (!_linker_enable_gdb_support) return;
+
struct link_map * map;
/* Copy the necessary fields into the debug structure.
@@ -188,20 +192,52 @@
* about leaf libraries, and ordering it this way
* reduces the back-and-forth over the wire.
*/
+
+ ///// PATCHED: we don't want libhybris modifying glibc's
+ ///// link_map objects, which should not be linked
+ ///// to bionic's stripped link_map objects.
+ ///// ==> make a copy of the whole chain
+ if(r_debug_tail == 0 && _r_debug.r_map != 0) {
+ struct link_map *glibc_link_map = malloc(sizeof(struct link_map));
+ glibc_link_map->l_addr = _r_debug.r_map->l_addr;
+ glibc_link_map->l_name = _r_debug.r_map->l_name;
+ glibc_link_map->l_ld = _r_debug.r_map->l_ld;
+ glibc_link_map->l_next = _r_debug.r_map->l_next;
+ glibc_link_map->l_prev = _r_debug.r_map->l_prev;
+
+ r_debug_tail = glibc_link_map;
+
+ while(glibc_link_map->l_next != 0) {
+ struct link_map *copy_next_link_map = malloc(sizeof(struct link_map));
+ copy_next_link_map->l_addr = glibc_link_map->l_next->l_addr;
+ copy_next_link_map->l_name = glibc_link_map->l_next->l_name;
+ copy_next_link_map->l_ld = glibc_link_map->l_next->l_ld;
+ copy_next_link_map->l_next = glibc_link_map->l_next->l_next;
+ copy_next_link_map->l_prev = glibc_link_map->l_next->l_prev;
+
+ glibc_link_map->l_next = copy_next_link_map;
+ copy_next_link_map->l_prev = glibc_link_map;
+
+ glibc_link_map = copy_next_link_map;
+ }
+ }
+
if (r_debug_tail) {
- r_debug_tail->l_next = map;
- map->l_prev = r_debug_tail;
- map->l_next = 0;
+ r_debug_tail->l_prev = map;
+ map->l_next = r_debug_tail;
+ map->l_prev = 0;
} else {
_r_debug.r_map = map;
map->l_prev = 0;
map->l_next = 0;
}
- r_debug_tail = map;
+ _r_debug.r_map = r_debug_tail = map;
}
static void remove_soinfo_from_debug_map(soinfo * info)
{
+ if (!_linker_enable_gdb_support) return;
+
struct link_map * map = &(info->linkmap);
if (r_debug_tail == map)
@@ -2345,10 +2381,11 @@
}
#ifdef WANT_ARM_TRACING
-void android_linker_init(int sdk_version, void *(get_hooked_symbol)(const char*, const char*), void *(create_wrapper)(const char*, void*, int)) {
+void android_linker_init(int sdk_version, void *(get_hooked_symbol)(const char*, const char*), int enable_linker_gdb_support, void *(create_wrapper)(const char*, void*, int)) {
#else
-void android_linker_init(int sdk_version, void *(get_hooked_symbol)(const char*, const char*)) {
+void android_linker_init(int sdk_version, void *(get_hooked_symbol)(const char*, const char*), int enable_linker_gdb_support) {
#endif
(void) sdk_version;
_get_hooked_symbol = get_hooked_symbol;
+ _linker_enable_gdb_support = enable_linker_gdb_support;
}
|
[-]
[+]
|
Changed |
_service:tar_git:libhybris-0.0.5.31.tar.bz2/libhybris/hybris/common/mm/linker.cpp
^
|
@@ -141,18 +141,22 @@
void __attribute__((noinline)) __attribute__((visibility("default"))) rtld_db_dlactivity();
static pthread_mutex_t g__r_debug_mutex = PTHREAD_MUTEX_INITIALIZER;
-static r_debug _r_debug =
+r_debug _r_debug =
{1, nullptr, reinterpret_cast<uintptr_t>(&rtld_db_dlactivity), r_debug::RT_CONSISTENT, 0};
-static link_map* r_debug_tail = 0;
+static link_map* r_debug_head = 0;
static void* (*_get_hooked_symbol)(const char *sym, const char *requester);
+static int _linker_enable_gdb_support = 0;
+
#ifdef WANT_ARM_TRACING
void *(*_create_wrapper)(const char *symbol, void *function, int wrapper_type);
#endif
static void insert_soinfo_into_debug_map(soinfo* info) {
+ if (!_linker_enable_gdb_support) return;
+
// Copy the necessary fields into the debug structure.
link_map* map = &(info->link_map_head);
map->l_addr = info->load_bias;
@@ -164,23 +168,43 @@
// gdb tends to care more about libc than it does
// about leaf libraries, and ordering it this way
// reduces the back-and-forth over the wire.
- if (r_debug_tail) {
- r_debug_tail->l_next = map;
- map->l_prev = r_debug_tail;
- map->l_next = 0;
+
+ ///// PATCHED: we don't want libhybris modifying glibc's
+ ///// link_map objects, which should not be linked
+ ///// to bionic's stripped link_map objects.
+ ///// ==> make a copy of the whole chain
+ if(r_debug_head == 0 && _r_debug.r_map != 0) {
+ link_map *glibc_link_map = new link_map(*_r_debug.r_map);
+ r_debug_head = glibc_link_map;
+
+ while(glibc_link_map->l_next != 0) {
+ link_map *copy_next_link_map = new link_map(*glibc_link_map->l_next);
+ glibc_link_map->l_next = copy_next_link_map;
+ copy_next_link_map->l_prev = glibc_link_map;
+
+ glibc_link_map = copy_next_link_map;
+ }
+ }
+
+ if (r_debug_head != 0) {
+ r_debug_head->l_prev = map;
+ map->l_next = r_debug_head;
+ map->l_prev = 0;
} else {
_r_debug.r_map = map;
map->l_prev = 0;
map->l_next = 0;
}
- r_debug_tail = map;
+ _r_debug.r_map = r_debug_head = map;
}
static void remove_soinfo_from_debug_map(soinfo* info) {
+ if (!_linker_enable_gdb_support) return;
+
link_map* map = &(info->link_map_head);
- if (r_debug_tail == map) {
- r_debug_tail = map->l_prev;
+ if (r_debug_head == map) {
+ r_debug_head = map->l_prev;
}
if (map->l_prev) {
@@ -3175,7 +3199,7 @@
map->l_next = nullptr;
_r_debug.r_map = map;
- r_debug_tail = map;
+ r_debug_head = map;
init_linker_info_for_gdb(linker_base);
@@ -3343,9 +3367,9 @@
}
#ifdef WANT_ARM_TRACING
-extern "C" void android_linker_init(int sdk_version, void* (*get_hooked_symbol)(const char*, const char*), void *(create_wrapper)(const char*, void*, int)) {
+extern "C" void android_linker_init(int sdk_version, void* (*get_hooked_symbol)(const char*, const char*), int enable_linker_gdb_support, void *(create_wrapper)(const char*, void*, int)) {
#else
-extern "C" void android_linker_init(int sdk_version, void* (*get_hooked_symbol)(const char*, const char*)) {
+extern "C" void android_linker_init(int sdk_version, void* (*get_hooked_symbol)(const char*, const char*), int enable_linker_gdb_support) {
#endif
// Get a few environment variables.
const char* LD_DEBUG = getenv("HYBRIS_LD_DEBUG");
@@ -3370,6 +3394,7 @@
set_application_target_sdk_version(sdk_version);
_get_hooked_symbol = get_hooked_symbol;
+ _linker_enable_gdb_support = enable_linker_gdb_support;
#ifdef WANT_ARM_TRACING
_create_wrapper = create_wrapper;
#endif
|
[-]
[+]
|
Changed |
_service:tar_git:libhybris-0.0.5.31.tar.bz2/libhybris/hybris/common/n/linker.cpp
^
|
@@ -4684,9 +4684,9 @@
}
#ifdef WANT_ARM_TRACING
-extern "C" void android_linker_init(int sdk_version, void* (*get_hooked_symbol)(const char*, const char*), void *(create_wrapper)(const char*, void*, int)) {
+extern "C" void android_linker_init(int sdk_version, void* (*get_hooked_symbol)(const char*, const char*), int enable_linker_gdb_support, void *(create_wrapper)(const char*, void*, int)) {
#else
-extern "C" void android_linker_init(int sdk_version, void* (*get_hooked_symbol)(const char*, const char*)) {
+extern "C" void android_linker_init(int sdk_version, void* (*get_hooked_symbol)(const char*, const char*), int enable_linker_gdb_support) {
#endif
// Get a few environment variables.
const char* LD_DEBUG = getenv("HYBRIS_LD_DEBUG");
@@ -4711,6 +4711,7 @@
set_application_target_sdk_version(sdk_version);
_get_hooked_symbol = get_hooked_symbol;
+ _linker_enable_gdb_support = enable_linker_gdb_support;
#ifdef WANT_ARM_TRACING
_create_wrapper = create_wrapper;
#endif
|
[-]
[+]
|
Changed |
_service:tar_git:libhybris-0.0.5.31.tar.bz2/libhybris/hybris/common/n/linker_gdb_support.cpp
^
|
@@ -33,7 +33,11 @@
static pthread_mutex_t g__r_debug_mutex = PTHREAD_MUTEX_INITIALIZER;
static link_map* r_debug_head = nullptr;
+int _linker_enable_gdb_support = 0;
+
void insert_link_map_into_debug_map(link_map* map) {
+ if (!_linker_enable_gdb_support) return;
+
// Stick the new library at the end of the list.
// gdb tends to care more about libc than it does
// about leaf libraries, and ordering it this way
@@ -46,16 +50,16 @@
if(r_debug_head == nullptr && _r_debug.r_map != nullptr) {
link_map *glibc_link_map = new link_map(*_r_debug.r_map);
r_debug_head = glibc_link_map;
-
+
while(glibc_link_map->l_next != nullptr) {
link_map *copy_next_link_map = new link_map(*glibc_link_map->l_next);
glibc_link_map->l_next = copy_next_link_map;
copy_next_link_map->l_prev = glibc_link_map;
-
+
glibc_link_map = copy_next_link_map;
}
}
-
+
if (r_debug_head != nullptr) {
r_debug_head->l_prev = map;
map->l_next = r_debug_head;
@@ -69,6 +73,8 @@
}
void remove_link_map_from_debug_map(link_map* map) {
+ if (!_linker_enable_gdb_support) return;
+
if (r_debug_head == map) {
r_debug_head = map->l_next;
}
|
[-]
[+]
|
Changed |
_service:tar_git:libhybris-0.0.5.31.tar.bz2/libhybris/hybris/common/n/linker_gdb_support.h
^
|
@@ -28,6 +28,7 @@
void notify_gdb_of_libraries();
extern struct r_debug _r_debug;
+extern int _linker_enable_gdb_support;
__END_DECLS
|
[-]
[+]
|
Changed |
_service:tar_git:libhybris-0.0.5.31.tar.bz2/libhybris/hybris/common/o/linker_gdb_support.cpp
^
|
@@ -45,7 +45,11 @@
static pthread_mutex_t g__r_debug_mutex = PTHREAD_MUTEX_INITIALIZER;
static link_map* r_debug_head = nullptr;
+int _linker_enable_gdb_support = 0;
+
void insert_link_map_into_debug_map(link_map* map) {
+ if (!_linker_enable_gdb_support) return;
+
// Stick the new library at the end of the list.
// gdb tends to care more about libc than it does
// about leaf libraries, and ordering it this way
@@ -58,16 +62,16 @@
if(r_debug_head == nullptr && _r_debug.r_map != nullptr) {
link_map *glibc_link_map = new link_map(*_r_debug.r_map);
r_debug_head = glibc_link_map;
-
+
while(glibc_link_map->l_next != nullptr) {
link_map *copy_next_link_map = new link_map(*glibc_link_map->l_next);
glibc_link_map->l_next = copy_next_link_map;
copy_next_link_map->l_prev = glibc_link_map;
-
+
glibc_link_map = copy_next_link_map;
}
}
-
+
if (r_debug_head != nullptr) {
r_debug_head->l_prev = map;
map->l_next = r_debug_head;
@@ -81,6 +85,8 @@
}
void remove_link_map_from_debug_map(link_map* map) {
+ if (!_linker_enable_gdb_support) return;
+
if (r_debug_head == map) {
r_debug_head = map->l_next;
}
|
[-]
[+]
|
Changed |
_service:tar_git:libhybris-0.0.5.31.tar.bz2/libhybris/hybris/common/o/linker_gdb_support.h
^
|
@@ -40,6 +40,7 @@
void notify_gdb_of_libraries();
extern struct r_debug _r_debug;
+extern int _linker_enable_gdb_support;
__END_DECLS
|
[-]
[+]
|
Changed |
_service:tar_git:libhybris-0.0.5.31.tar.bz2/libhybris/hybris/common/o/linker_main.cpp
^
|
@@ -499,9 +499,9 @@
void *(*_create_wrapper)(const char *symbol, void *function, int wrapper_type);
#ifdef WANT_ARM_TRACING
-extern "C" void android_linker_init(int sdk_version, void* (*get_hooked_symbol)(const char*, const char*), void *(create_wrapper)(const char*, void*, int)) {
+extern "C" void android_linker_init(int sdk_version, void* (*get_hooked_symbol)(const char*, const char*), int enable_linker_gdb_support, void *(create_wrapper)(const char*, void*, int)) {
#else
-extern "C" void android_linker_init(int sdk_version, void* (*get_hooked_symbol)(const char*, const char*)) {
+extern "C" void android_linker_init(int sdk_version, void* (*get_hooked_symbol)(const char*, const char*), int enable_linker_gdb_support) {
#endif
// Get a few environment variables.
const char* LD_DEBUG = getenv("HYBRIS_LD_DEBUG");
@@ -526,6 +526,7 @@
set_application_target_sdk_version(sdk_version);
_get_hooked_symbol = get_hooked_symbol;
+ _linker_enable_gdb_support = enable_linker_gdb_support;
#ifdef WANT_ARM_TRACING
_create_wrapper = create_wrapper;
#endif
|