Подстановка макросов в динамически связанном общем объекте - PullRequest
0 голосов
/ 05 марта 2019

У меня есть исполняемый файл скомпилированного исходного кода, который переопределил malloc() с помощью пользовательской функции CustMalloc(), использующей подстановку макросов.

Как видно из приведенного ниже следа, исполняемый файл скомпилированного исходного кода должен быть динамическисвязаны с libMRegAccess.so и libusb-1.0.so.0 общими объектами .Оба эти общих объекта были независимо скомпилированы , и у них нет возможности узнать вышеупомянутую подстановку макросов во время их компиляции.

Теперь bsd-asprintf.c Я полагаю,исходный файл linux и вызов asprintf() и vasprintf() вызываются из общего объекта libusb-1.0.so.0 при выполнении, которое, в свою очередь, пытается вызвать malloc().

Я не могу понять, почему вызывается пользовательская функция CustMalloc() вместо действительного malloc().

К вашему сведению, семафор, который требуется в этой трассировке, еще не создан, и, следовательно,авария.Ожидается, что CustMalloc() не должен вызываться в этом потоке кода, поскольку вызов выполняется из независимо созданного общего объекта.

Program received signal SIGSEGV, Segmentation fault.
[Switching to LWP 1269]
0x0000007fb7f896cc in __new_sem_wait_fast () from /lib//libpthread.so.0
(gdb) bt
#0  0x0000007fb7f896cc in __new_sem_wait_fast () from /lib//libpthread.so.0
#1  0x0000007fb7f898fc in sem_wait@@GLIBC_2.17 () from /lib//libpthread.so.0
#2  0x0000000001b09000 in SemTake (SemId=0x0) at <compiled_source_code.c>
#3  0x0000000000d6cffc in ContextLock () at <compiled_source_code.c>
#4  0x0000000000d993e4 in CustMalloc (size=128) at <compiled_source_code.c>
#5  0x0000000001c88a2c in vasprintf (str=0x7fb5eaf5f8, fmt=0x7fb7e8a640 "usb%s", ap=...) at bsd-asprintf.c:61
#6  0x0000000001c88c50 in asprintf (str=0x7fb5eaf5f8, fmt=0x7fb7e8a640 "usb%s") at bsd-asprintf.c:120
#7  0x0000007fb7e853cc in linux_enumerate_device () from /usr/lib/libusb-1.0.so.0
#8  0x0000007fb7e854c4 in sysfs_scan_device () from /usr/lib/libusb-1.0.so.0
#9  0x0000007fb7e85b80 in op_init () from /usr/lib/libusb-1.0.so.0
#10 0x0000007fb7e7dd1c in libusb_init () from /usr/lib/libusb-1.0.so.0
#11 0x0000007fb7ea65fc in cyusb_open(unsigned short, unsigned short) () from /usr/lib/libMRegAccess.so
#12 0x0000007fb7ea33f4 in InitDefaultUSBConn () from /usr/lib/libMRegAccess.so
#13 0x0000007fb7ea58e0 in openDefaultUSBDriver () from /usr/lib/libMRegAccess.so
#14 0x00000000010ddd94 in InitDrv () at <compiled_source_code.c>
#15 ... at <compiled_source_code.c>
#16 ... at <compiled_source_code.c>
#17 ... at <compiled_source_code.c>
#18 ... at <compiled_source_code.c>
#19 0x0000007fb7f80fd0 in start_thread () from /lib//libpthread.so.0
#20 0x0000007fb7d8cf60 in ?? () from /lib//libc.so.6

1 Ответ

0 голосов
/ 08 марта 2019

Я не могу понять, почему вызывается пользовательская функция CustMalloc () вместо действительной функции malloc ()

Это происходит, потому что you скомпилированный и связанный bsd-asprintf.c (с вашим переопределением макроса) в ваш основной исполняемый файл.

Вы можете сказать, что asprintf и CustMalloc являются частью вашего двоичного файла, потому что их адреса сильно отличаются от других библиотекподпрограммы (например, linux_enumerate_device или sem_wait).

Если вы хотите узнать, где определен asprintf (из какой архивной библиотеки или объектного файла он получен), повторно связать ваш исполняемый файл с флагом -Wl,-y,asprintf, и компоновщик скажет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...