#c #debugging #dynamic-linking #c-libraries
#c #отладка #динамическое связывание #c-библиотеки
Вопрос:
Если я хочу клонировать библиотеку и изменить только одну функцию, скажем, memcpy или memmove, и у меня есть уже встроенная исполняемая ссылка на нее для целей отладки / исследования, каков правильный способ сделать это?
Я предполагаю, что мне нужно перекомпилировать всю библиотеку с моими изменениями, но есть ли другой способ сделать это?
Я понимаю, что существуют такие вещи, как перехваты malloc, но это, похоже, особый случай для malloc. Мне любопытно узнать о специфике того, как valgrind и gdb делают это из другой программы, если у кого-то есть ресурсы для этого.
Меня интересуют решения для Mac и Linux. В Linux я уже использовал LD_LIBRARY_PATH раньше — это все, что мне нужно сделать, кроме того, чтобы имена библиотек были одинаковыми? Как бы я это сделал на Mac?
Для тех, кому интересно, почему я хочу это сделать, цель — экспериментальная музыка. Я делаю это для оптимизации операций с памятью, поэтому memcpy / memmove будет работать в обычном режиме, но доступные данные также будут отправлены на звуковую карту. Я знаю, что есть другие способы сделать это (я уже использовал несколько других методов), но в настоящее время я заинтересован в том, чтобы сосредоточиться на memcpy / memmove, поэтому я буду признателен, если вы сможете ограничить свои ответы этим фокусом.
Ответ №1:
Вы можете использовать LD_LIBRARY_PATH
, чтобы заставить программу загрузить библиотеку общих объектов, отличную от обычной. Но если вы хотите заменить только одну функцию (или несколько), а не целую библиотеку, вы можете использовать LD_PRELOAD
, чтобы вызвать компоновщик (ld.so) для ранней загрузки определенного общего объекта, и ваша программа будет использовать символы (функции) там, а не искать их в обычных местах.
Комментарии:
1. прохладный. Пока у меня есть соответствующие подписи, все просто работает?
2. Что ж, для ясности, это опасная ситуация, возможно, не «все» будет «просто работать», но да, пока подписи совпадают, есть надежда, что все будет работать так, как вы ожидаете, просто будьте осторожны, потому что, очевидно, некоторым библиотекам может не понравиться замена их функций (если у вашей другие побочные эффекты или что-то еще). Что касается того, как компоновщик находит функции, стоит отметить, что это происходит только по (искаженному) имени и не зависит от сигнатуры типа.