【问题标题】:Macro substitution on a dynamically linked shared object动态链接共享对象上的宏替换
【发布时间】:2019-07-26 14:55:33
【问题描述】:

我有一个编译的源代码可执行文件,它使用宏替换使用自定义函数 CustMalloc() 重新定义了 malloc()

从下面的回溯可以看出,编译后的源代码可执行文件应该与 libMRegAccess.solibusb-1.0.so.0 共享对象 动态链接。这两个共享对象都是独立编译的,它们在编译过程中无法知道上述宏替换。

现在,bsd-asprintf.c 我假设是一个 linux 源文件,并且对 asprintf()vasprintf() 的调用是从共享的 libusb-1.0.so.0 调用的object 在执行时会尝试调用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

【问题讨论】:

    标签: c macros dynamic-linking shared-objects


    【解决方案1】:

    我无法理解为什么调用自定义函数 CustMalloc() 而不是实际的 malloc()

    这似乎是因为编译并链接bsd-asprintf.c(带有您的宏重新定义)到您的主可执行文件中。

    您可以看出asprintfCustMalloc 是二进制文件的一部分,因为它们的地址与其他库例程(例如linux_enumerate_devicesem_wait)非​​常不同。

    如果您想知道asprintf 的定义位置(它来自哪个存档库或目标文件),请使用-Wl,-y,asprintf 标志重新链接您的可执行文件,链接器会告诉您。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多