我有这样的代码
// test_printf.c
#include <stdio.h>
int f(){
printf("aaa %d\n", 1);
}
我用下面的代码编译它
gcc -shared -fPIC -m32 -g -c -o test_printf.so test_printf.c
我想如果跑readelf -S test_printf.so
,我会看到.rel.dyn
和.rel.plt
。这是因为这两个部分的行为都类似于静态链接程序中.rel.data
的行为。.rel.text
例如,在我的程序中,sinceprintf
是一个外部符号,由 my 引用test_printf.so
。因此,当我查看test_printf.so
的重定位表时,应该有一个条目名称printf
。我检查了一下,条目存在。
然后我想,既然printf
是外部符号,它的位置应该在运行时确定。.got.plt
但是,我们必须为这个函数分配一个节,printf
该节应该在动态链接的执行程序和动态库(test_printf.so)中。
但是,当我运行时readelf -S
,没有.got.plt
部分,我对此感到困惑。动态库(test_printf.so)中是否不需要此部分?我不认为这是可能的。假设test_printf.so
最终与执行程序链接a
,那么如何a
知道.got.plt
段在printf
哪里呢?这.got.plt
最终生成在a
?
同时,我有一个问题 2。如果存在.rel.dyn
和,是否.rel.plt
总是存在?.got
.got.plt