从目标文件中提取一个部分以单独的.o

问题描述 投票:0回答:1

我有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

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

c gcc elf binutils object-files
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.