2

我正在研究动态重定位过程,并创建了一个非常简单的共享对象:

int func_1(int v)
{
    v + 10;
}

int func_2()
{
   return func_1(10);
}

编译为:

gcc -fPIC -c libtest.c
gcc -shared -nostdlib -o libtest.so libtest.o

如果我们查看共享对象的动态重定位:

$ objdump -R libtest.so

libtest.so:    file format elf32-i386

DYNAMIC RELOCATION RECORDS
OFFSET   TYPE              VALUE
00002000 R_386_JUMP_SLOT   func_1

该符号有一个 R_386_JUMP_SLOT,因此PLT 解决了func_1其中的调用。func_2我不知道这是什么原因...如果func_1声明为私有(static),则重定位将消失,并且调用(通过静态链接器)通过相对分支解决。为什么从PLT传球比相对跳跃要好?

4

1 回答 1

1

使用 PLT,您可以在运行时覆盖调用 fromfunc_2以调用其他版本。func_1例如通过LD_PRELOAD. 使用 static 关键字,您只需硬编码您自己的私有版本的func_1. 它的灵活性与小运行时开销。

于 2013-12-18T14:26:04.230 回答