Замена malloc через разделяемую библиотеку - PullRequest
1 голос
/ 14 июня 2019

Я работаю над проектом на основе cmake в среде Unix.Я создал общую библиотеку myMalloc.so, в которой я определил свой собственный malloc / free / realloc и т. Д.:

//   myMalloc.cpp

extern "C" __typeof (malloc) __libc_malloc;
extern "C" {

void* malloc( size_t _size )
{
    /*some code that allows me to determine if this version of malloc was called*/
    return __libc_malloc( _size );
}
}

Некоторая другая общая библиотека proxy.so связана с myMalloc.so.Наконец, proxy.so связан с исполняемым двоичным файлом.

Проблема заключается в том, что в исполняемом файле используется по умолчанию glibc malloc вместо моего собственного malloc.


Я пытался добавить следующие флаги в несколько разных файлов CMakeLists.txt

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free")

, но это не помогло.


Я проверил readelf -Ws myMalloc.so и вижу мою версию malloc, помеченную как GLOBAL, показанную перед любым другим malloc

58: 0000000000017110    79 FUNC    GLOBAL DEFAULT   11 malloc
255: 0000000000017110    79 FUNC    GLOBAL DEFAULT   11 malloc
304: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_malloc

Тогда я 'проверил readelf -Ws proxy.so и, к сожалению, glibc malloc виден раньше, чем мой пользовательский malloc (я предполагаю, что это означает, что версия glibc будет предпочтительнее)

72: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND malloc@GLIBC_2.2.5 (10)
450: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND malloc

readelf -Ws в исполняемом файле нет в спискелюбая версия malloc


Компиляция myMalloc в качестве статической библиотеки не помогает, но компиляция myMalloc и proxy в качестве статической библиотеки, кажется, помогает (malloc также отображается в таблице символов исполняемого файла).

К сожалению, это не вариант, и эти библиотеки должны оставаться общими, и я не могу использовать трюк LD_PRELOAD


Что может быть не так?Я предполагаю, что какая-то другая библиотека, которая использует glibc malloc, была связана ранее, но я понятия не имею, как подойти к этому.Я надеялся, что упомянутые ранее флаги в cmake помогут, но, очевидно, они не помогут.

Я провел несколько дней, копаясь в интернете по этому вопросу, поскольку мои знания по make-файлам / компоновщикам несколько ограничены, и я не мог найти больше информации, я буду признателен за любые предложения.


Редактировать: я не вижу, как отмеченный дублирующий вопрос отвечает на мой вопрос. У меня есть конкретная проблема, связанная с общими библиотеками, хотя ссылки даже не упоминаются вдублировать.

...