2017-01-03 12 views
-1

Я хочу добавить самоопределенную функцию таНоса (например, «self_malloc()„) и функция выбора (например,“selec_malloc()») в операционную систему Linux.Как добавить самоопределенный таНос к Linux

Каждый раз, когда процесс должен вызывать таНос для alloction памяти, операционная система будет Invoke selec_malloc(), чтобы решить, чтобы вызвать оригинальный таНос или self_malloc()

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

Надеюсь на вашу помощь.

+0

Вы хотите сделать это для вашей собственной программы, или перехватить выделение памяти от других запущенных программ на одной и той же системе? – Frank

+1

Не знаю, есть ли официальный способ сделать это. Но вы, вероятно, могли бы исправить и перекомпилировать c-runtimelibrary в вашей системе. (glibc) – MikeMB

+0

'malloc' не предоставляется операционной системой (Linux) в качестве системного вызова, но реализуется стандартной библиотекой C. –

ответ

1

malloc не является частью Linux, а является частью libc. Вы можете предоставить свою собственную версию libc другой версией malloc. В этом случае вы можете переключаться между различными версиями malloc, переключая путь поиска библиотеки.

Другой вариант - использование LD_PRELOAD. Это предварительно загружает общую библиотеку при запуске программы. Благодаря этому вы можете перегружать функции из общих библиотек с версиями в предварительно загруженной библиотеке. Можно даже назвать оригинальную версию из вашего кода с помощью dlsym и RTLD_NEXT так:

typedef void *(*malloc_ptr)(size_t size); 

void *malloc(size_t size) { 
    malloc_ptr _malloc; 
    _malloc=(malloc_ptr)dlsym(RTLD_NEXT,"malloc"); // look up original malloc() 
    return malloc_(size);       // and invoke it 
} 

Выбор, который используется таНос версии зависит от наличия LD_PRELOAD. Если он установлен, будет использоваться предварительно загруженный malloc, если он не установлен, будет использоваться стандартная версия.

Вызов программы выглядит следующим образом:

LD_PRELOAD=libmymalloc.so ./a.out 
+0

спасибо. Это очень полезно !!! –