Я работаю над проектом на основе 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-файлам / компоновщикам несколько ограничены, и я не мог найти больше информации, я буду признателен за любые предложения.
Редактировать: я не вижу, как отмеченный дублирующий вопрос отвечает на мой вопрос. У меня есть конкретная проблема, связанная с общими библиотеками, хотя ссылки даже не упоминаются вдублировать.