在我的Debian x86 32位中,当我执行readelf -r /usr/lib/libstdc++.so.6时grep pthread,我得到了这个输出:
000eceac 00006206 R_386_GLOB_DAT 00000000 pthread_cancel
000ed058 00000807 R_386_JUMP_SLOT 00000000 pthread_cond_destroy
000ed148 00001207 R_386_JUMP_SLOT 00000000 pthread_cond_signal
000ed1e8 00001e07 R_386_JUMP_SLOT 00000000 pthread_key_create
000ed320 00002a07 R_386_JUMP_SLOT 00000000 pthread_once
000ed418 00003607 R_386_JUMP_SLOT 00000000 pthread_getspecific
000ed42c 00003a07 R_386_JUMP_SLOT 00000000 pthread_mutex_unlock
000ed4ec 00004607 R_386_JUMP_SLOT 00000000 pthread_create
000ed54c 00004b07 R_386_JUMP_SLOT 00000000 pthread_equal
000ed678 00005607 R_386_JUMP_SLOT 00000000 pthread_mutex_lock
000ed71c 00006007 R_386_JUMP_SLOT 00000000 pthread_cond_wait
000ed7b0 00006907 R_386_JUMP_SLOT 00000000 pthread_key_delete
000ed8b4 00007307 R_386_JUMP_SLOT 00000000 pthread_cond_broadcast
000ed8c0 00007507 R_386_JUMP_SLOT 00000000 pthread_detach
000ed8f0 00007a07 R_386_JUMP_SLOT 00000000 pthread_setspecific
000ed968 00007c07 R_386_JUMP_SLOT 00000000 pthread_join
但是,当我列出/usr/lib/libstdc++.so.6的依赖项时,未列出libpthread:
john@ThirdEarth:~$ ldd /usr/lib/libstdc++.so.6
linux-gate.so.1 => (0xb77df000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb76ad000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7566000)
/lib/ld-linux.so.2 (0xb77e0000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7547000)
那么动态加载器如何解决这些依赖关系呢?我在__gmon_start__中发现了类似的问题,粗略地说,这是这个符号的定义吗?
答案 0 :(得分:4)
Linux中的pthread函数在libc中实现。
例如,在我不得不提供的系统上:
objdump -T /lib/libc-2.11.1.so | grep pthread
给出
00000000000f64a0 g DF .text 0000000000000026 GLIBC_2.3.2 pthread_cond_signal
0000000000126100 g DF .text 0000000000000026 (GLIBC_2.2.5) pthread_cond_signal
00000000000f6be0 g DF .text 000000000000005a GLIBC_PRIVATE __libc_pthread_init
00000000000f65f0 g DF .text 0000000000000026 GLIBC_2.2.5 pthread_mutex_lock
00000000000f63e0 g DF .text 0000000000000026 GLIBC_2.2.5 pthread_condattr_init
00000000000f6290 g DF .text 0000000000000026 GLIBC_2.2.5 pthread_attr_getschedparam
...
答案 1 :(得分:0)
要回答问题的第二部分,__gmon_start__
是其中的一部分
C运行时,在构建可执行文件时使用
gprof(1) - 样式分析。
在Ubuntu GNU / Linux上,相关的定义可以在/usr/lib/gcrt1.o
中找到:
% nm /usr/lib/gcrt1.o| grep -C2 gmon_start
00000000 R _IO_stdin_used
00000000 D __data_start
00000030 T __gmon_start__
U __libc_csu_fini
U __libc_csu_init
对于正常的编译运行,/usr/lib/crti.o
提供了一个“弱”定义:
% nm /usr/lib/crti.o| grep -C2 gmon_start
U _GLOBAL_OFFSET_TABLE_
w __gmon_start__
00000000 T _fini
00000000 T _init