我有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.o
,objcopy -R .text.b file.o test.o
,objcopy --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
我无法弄清楚,如何取消定义或外化符号。
答案 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