【发布时间】:2021-08-20 06:56:42
【问题描述】:
我编译了一个目标文件shm.o,并将其打包为共享库libshm.so
arm-linux-gnueabihf-gcc -fPIC -o shm.o -c shm.c
arm-linux-gnueabihf-gcc -shared shm.o -o libshm.so -lrt
其中shm.c 和nm libshm.so 的输出如下所示。
/*shm.c*/
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
void func_shm(void)
{
int ret = shm_open("/test_shm", O_CREAT, 0644);
}
/*output of nm*/
00000328 t $a
000002e4 t $a
00000484 t $a
...
...
00000328 t call_weak_fn
0001102c b completed.10740
w __cxa_finalize@@GLIBC_2.4
...
...
0000034c t deregister_tm_clones
000003e0 t __do_global_dtors_aux
00010f0c t __do_global_dtors_aux_fini_array_entry
00011028 d __dso_handle
00010f10 a _DYNAMIC
00000484 t _fini
00000448 t frame_dummy
00010f08 t __frame_dummy_init_array_entry
00000498 r __FRAME_END__
0000044c T func_shm
00011000 a _GLOBAL_OFFSET_TABLE_
w __gmon_start__
000002e4 t _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
00000390 t register_tm_clones
U shm_open@@GLIBC_2.4
0001102c d __TMC_END__
正如它所看到的,在倒数第二行,shm_open 是一个未定义的符号,即使附加了-lrt。
根据shm_open(3) — Linux manual page;但是nm中显示的glibc版本是2.4。
这些函数在 glibc 2.2 及更高版本中提供。
我的期望是
-
libshm.so将定义为shm_open,因为-lrt被附加在命令的末尾;因此shm_open不会是未定义的符号。 -
任何调用
func_shm的应用程序只需要链接到libshm.so未指定-lrt
应该怎么做才能解决这个问题?
【问题讨论】:
-
尝试使用 -lpthread 和 -lrt。
-
试过了。不管是
arm-linux-gnueabihf-gcc -shared shm.o -o libshm.so -lrt -lpthread还是arm-linux-gnueabihf-gcc -shared shm.o -o libshm.so -lpthread -lrt,还是未定义的符号。 -
您可以尝试发布原始错误消息。我仍然不确定这是您遇到的链接时问题,还是运行时问题 - 即 dlopen()。
标签: linux linker shared-libraries shared-memory glibc