LD_PRELOAD malloc для shm_open

Я пытаюсь перехватить malloc вызов, используя LD_PRELOAD. Я хочу переместить все выделение памяти в разделяемую память, изменив malloc на shm_open, а затем mmap. Как мне это сделать?

LD_PRELOAD из malloc работает нормально. Я могу перехватить каждый malloc вызов. Однако вызов shm_open в перехваченном malloc завершается ошибкой, потому что shm_open требует связывания librt, которое ссылается на libdl, которое требует dlsym в LD_PRELOAD. Есть рекурсивная интерпозиция. Я думал о создании статической библиотеки обернутого выделения разделяемой памяти. Затем вызовите его из перехваченного malloc. Но librt нельзя связать динамически.


person fkengun    schedule 11.04.2019    source источник


Ответы (1)


Как мне это сделать?

В общем, нельзя.

Если вы хотите вставлять низкоуровневые функции, такие как malloc, лучше всего использовать только прямые системные вызовы более низкого уровня.

Использование чего-либо более высокого уровня, такого как shm_open, рано или поздно приведет к проблемам. Даже если shm_open не использовал librt и dlopen сегодня, ничто не мешает ему сделать это завтра (и разрушить ваш тщательно сконструированный карточный домик).

Помимо очевидных проблем с прямой рекурсией, также могут быть проблемы с "порядком инициализации" (например, shm_open может потребовать, чтобы malloc и librt были инициализированы, что не гарантируется при вызове самого первого malloc).

person Employed Russian    schedule 13.04.2019
comment
Я пытаюсь переместить его в файловый дизайн с отображением памяти. Вы видите ту же проблему, что и с общей памятью. - person fkengun; 13.04.2019