【问题标题】:Relocations R_386_JUMP_SLOT of local symbols in shared object共享对象中局部符号的重定位 R_386_JUMP_SLOT
【发布时间】:2013-05-30 15:39:50
【问题描述】:

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

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

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

【问题讨论】:

  • 正如@Miroslav 所写,这是为了允许介入。如果您不想将func1 的使用限制为单个文件(翻译单元)但仍不想导出符号,请查看stackoverflow.com/questions/6538501/…

标签: linux gcc linker dynamic-linking dynamic-library


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    相关资源
    最近更新 更多