いくつかの前文
malloc、calloc、realloc、freeはすべてとで複製されているようld-linux.so
ですlibc.so
。私が理解しているように、これは動的ローダーによって行われ、ロードされるld-linux.so
前に内部のメモリ管理を処理libc.so
し、そのメモリ管理機能を実行可能にします。ただし、これらの重複したシンボルについていくつか質問があります。
これは、mallocを呼び出して終了する非常に単純なCプログラムです。
#include <stdlib.h>
int main()
{
void *p = malloc(8);
return 0;
}
x86_64 linuxボックスでgccを使用してコンパイルし、gdbを使用してデバッグを行います。
$ gcc -g -o main main.c
$ gdb ./main
(gdb) start
Temporary breakpoint 1 at 0x4004f8
Starting program: main
Temporary breakpoint 1, 0x00000000004004f8 in main ()
(gdb) info symbol malloc
malloc in section .text of /lib64/ld-linux-x86-64.so.2
(gdb) b malloc
Breakpoint 2 at 0x7ffff7df0930: malloc. (2 locations)
(gdb) info breakpoints
Num Type Disp Enb Address What
2 breakpoint keep y <MULTIPLE>
2.1 y 0x00007ffff7df0930 in malloc at dl-minimal.c:95
2.2 y 0x00007ffff7a9f9d0 in __GI___libc_malloc at malloc.c:2910
libc.soおよびld.soのnmは、次のことを示しています。
$ nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep malloc
00000000000829d0 T __libc_malloc
00000000003b6700 V __malloc_hook
00000000003b8b00 V __malloc_initialize_hook
00000000000829d0 T malloc
0000000000082db0 W malloc_get_state
00000000000847c0 T malloc_info
0000000000082480 W malloc_set_state
00000000000844f0 W malloc_stats
0000000000084160 W malloc_trim
00000000000844b0 W malloc_usable_size
$ nm -D /lib64/ld-linux-x86-64.so.2 | grep malloc
0000000000016930 W malloc
質問
malloc
はで複製されlibc.so
ますが、それが弱い記号であるld-linux.so
場合は、両方が同じアドレスに解決される必要があります。ld-linux.so
さらに、私が理解しているように、ダイナミックローダーのシンボル解決テーブルはグローバルであり、シンボルごとに1つのアドレスのみを解決します(間違っている場合は修正してください)。ただし、gdbはそれ以外のことを明確に示しています(2つの異なるアドレス)。何故ですか?
gdbは、入力時に2つの異なるアドレスで効果的に中断します
break malloc
が、入力時にld.soのシンボルの情報のみを表示しますinfo symbol malloc
。何故ですか?私はmallocでブレークし、独自
libc.so
のシンボルを定義していますが(nmで示されているように)、gdbはシンボルでブレークします。何故ですか?malloc
__GI___libc_malloc