假设我有以下源文件:
// file.c:
void f() {}
void g() {}
我使用以下方法将其编译为目标文件gcc -ffunction-sections
:
$ gcc -c -ffunction-sections file.c -o file.o
# It now has at least two sections: `.text.f' (with `f'), `.text.g' (with `g').
然后我尝试从目标文件中删除部分.text.g
(带):g
$ objcopy --remove-section .text.g file.o
objcopy: stQOLAU8: symbol `.text.g' required but not present
objcopy:stQOLAU8: No symbols
那么,有没有办法从目标文件(用 编译-ffunction-sections
)中删除特定于函数的部分?
额外信息:
符号的完整列表
file.o
是:$ objdump -t file.o file.o: file format elf64-x86-64 SYMBOL TABLE: 0000000000000000 l df *ABS* 0000000000000000 file.c 0000000000000000 l d .text 0000000000000000 .text 0000000000000000 l d .data 0000000000000000 .data 0000000000000000 l d .bss 0000000000000000 .bss 0000000000000000 l d .text.f 0000000000000000 .text.f 0000000000000000 l d .text.g 0000000000000000 .text.g 0000000000000000 l d .note.GNU-stack 0000000000000000 .note.GNU-stack 0000000000000000 l d .eh_frame 0000000000000000 .eh_frame 0000000000000000 l d .comment 0000000000000000 .comment 0000000000000000 g F .text.f 0000000000000007 f 0000000000000000 g F .text.g 0000000000000007 g
我的目标是从目标文件中删除某些部分,类似于这样
ld --gc-sections
做。
或者是否有一些理论上的原因为什么这样的任务绝对超出了范围objcopy
并且只能执行ld -r
?