【问题标题】:Extract a section from object file to separate .o从目标文件中提取一个部分以分隔 .o
【发布时间】:2017-07-17 01:49:20
【问题描述】:

我有 C 语言、gcc 工具链、elf32 格式的目标文件。

假设我有函数 a(),其中包括对函数 b() 的调用。如果它们在单个 .c 文件中,则生成的 .o 文件包含 .text.a.text.b 部分,.rel.text.a 包含对符号“b”的引用,而符号表包含引用部分 .text.b 的符号“b” .

如果源中仅包含a(),则生成的目标文件仅包含.text.a 部分,.rel.text.a 包含对符号“b”的引用,而符号表包含符号“b”,但不引用任何符号(Ndx = UND)。在这种情况下,符号引用由链接器在以后的状态下解析。

我想要获取第二个目标文件(没有.text.b 部分,只包含.text.a 和不引用任何内容的符号“b”)没有从源中删除函数b()定义。

(背景:我有包含几个函数的源文件,我无法编辑源文件,我需要将它们分开为单独的目标文件,然后再将它们链接在一起。)

objcopy -j .text.a file.o test.oobjcopy -R .text.b file.o test.oobjcopy --add-symbol b=0 -j .text.a file.o test.o 等命令以以下错误结束:

objcopy: build/test.o: symbol `b' required but not present
objcopy:build/test.o: No symbols

我不知道如何取消定义或外化符号。

【问题讨论】:

    标签: c gcc elf binutils object-files


    【解决方案1】:

    我有包含多个函数的源文件,我无法编辑源文件,我需要将它们分开以单独的目标文件

    最简单的解决方案是预处理原始文件,将其拆分为多个临时文件,然后分别编译。示例:

    // file.c
    int a()
    {
      return b();
    }
    int b()
    {
      return 42;
    }
    
    sed -e '/^int b/,$d' file.c | gcc -c -xc - -o file.a.o
    sed -e '1,/^}/d' file.c | gcc -c -xc -o -o file.b.o
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      相关资源
      最近更新 更多