从对象文件中提取一个部分以分隔.o

时间:2017-02-26 13:15:36

标签: c gcc elf binutils object-files

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

我们假设我的函数a()包含对函数b()的调用。如果它们位于单个.c文件中,则生成的.o文件包含.text.a.text.b个部分,.rel.text.a包含对符号的引用" b"和符号表包含符号" b"引用.text.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

我无法弄清楚,如何取消定义或外化符号。

1 个答案:

答案 0 :(得分:0)

  

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

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

// 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