【问题标题】:How to set the The section number of a symbol when compiling ELF binary?编译 ELF 二进制文件时如何设置符号的节号?
【发布时间】:2015-02-07 22:19:34
【问题描述】:

测试在 32 位 Linux、x86 上进行。

假设在我的汇编程序final.s 中,我必须加载一些库符号,比如stdin@@GLIBC_2.0,并且我想将这些符号加载到固定地址中。

所以按照question 中的说明,我这样做了:

echo ""stdin@@GLIBC_2.0" = 0x080a7390;" > symbolfile
echo ""stdin@GLIBC_2.0 (4)" = 0x080a7390;" >> symbolfile
gcc -Wl,--just-symbols=symbolfile  final.s -g

当我检查符号表的输出时,我得到了这个:

readelf -s a.out | grep stdin
53: 080a7390     4 OBJECT  GLOBAL DEFAULT  ABS stdin@@GLIBC_2.0
17166: 080a7390     0 NOTYPE  GLOBAL DEFAULT  ABS stdin@GLIBC_2.0 (4)

与需要stdin 符号的普通 ELF 二进制文件相比:

readelf -s hello.out | grep stdin

17199: 0838b8c4     4 OBJECT  GLOBAL DEFAULT   25 stdin@@GLIBC_2.0
52: 0838b8c4     4 OBJECT  GLOBAL DEFAULT   25 stdin@GLIBC_2.0 (4)

所以我发现一个明显的区别是Ndx 列,比如说,我的固定位置符号的节号是ABS。请查看参考资料here

执行a.out 时,会抛出segmentation fault 错误。

所以我的问题是,如何设置符号固定位置的节号?

【问题讨论】:

    标签: c linux assembly linker elf


    【解决方案1】:

    我想将这些符号加载到固定地址中。

    您正在从 GLIBC 导入这些符号。除非您正在执行完全静态链接,否则您没有发言权这些符号的最终地址。

    所以我的问题是,如何设置符号的节号

    这个问题没有意义:节号本身没有意义25 可能在一个可执行文件中引用 .bss,但在另一个可执行文件中引用 .text

    你的部分25恰好是.bss在这个特定的系统上和这个特定的版本。尝试构建一个完全静态的二进制文件,您可能会看到 24 部分。

    无论如何,一个普通的可执行文件会从libc.so.6 复制stdin。您最好阅读this description 的过程,并特别注意“额外功劳#2:从可执行文件中引用共享库数据”部分。

    但首先理解完全静态的情况可能更容易。

    【讨论】:

    • 嗨,是的,我确实想将这些符号加载/导入到.bss 部分。有没有可能成功?
    猜你喜欢
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    相关资源
    最近更新 更多