我有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 = 未达)。在这种情况下,符号引用由链接器在稍后的状态解析。
我想要获取第二个目标文件(没有
.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
我不知道如何取消定义或外部化符号。
我有包含多个函数的源文件,我无法编辑源文件,我需要将它们分开以单独的目标文件
最简单的解决方案是预处理原始文件,将其拆分为多个临时文件,然后单独编译。示例:
// 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