1

私の 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__ で同様の問題を見つけました。大まかに言えば、このシンボルの定義はどこですか?

4

2 に答える 2

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
...
于 2012-10-02T03:49:37.347 に答える
0

質問の 2 番目の部分に答えるに__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
于 2012-10-02T12:19:02.053 に答える