我想用来objcopy将二进制形式的文本文件包含到可执行文件中.(在运行时我需要将文件作为字符串).这工作正常,直到链接器需要从符号名称中查找引用.问题是objcopy在符号名称前加上文件的路径名.由于我使用GNU Autotools发送包,这个前置路径名发生了变化,我不知道在C/C++程序中使用什么外部链接器符号.
nm libtest.a |grep textfile
textfile.o:
00001d21 D _binary__home_git_textfile_end
00001d21 A _binary__home_git_textfile_size
00000000 D _binary__home_git_textfile_start
Run Code Online (Sandbox Code Playgroud)
libtest.a 是用(从Makefile.am中提取)生成的:
SUFFIXES = .txt
.txt.$(OBJEXT):
objcopy --input binary --output elf32-i386 --binary-architecture i386 $< $@
Run Code Online (Sandbox Code Playgroud)
我怎样才能告诉objcopy我们文件名的词干作为链接符号?或者还有另一种解决问题的方法吗?
我想定义const char*程序使用的外部全局符号 ( )。在链接时添加具有给定值的符号。这对于例如提交哈希或构建时间很有用。
我发现--defsym它做了别的事情。Go 链接器通过-X选项支持此功能。(是的,我知道,Go 字符串是管理的,但我说的是普通的零终止 c 字符串)
例如:
extern const char *git_commit;
int main(int argc, char *argv[]) {
puts(git_commit);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
gcc main.o -Wl<something here that adds git_commit and set it to '84e5...'>
Run Code Online (Sandbox Code Playgroud)
我知道包含这些 string的config.h方法和构建目标文件。但它的 2019 年知道。如此简单的任务应该很容易。
编辑更精确的问题
Go Linker 的-X选项在 gcc/binutils 中是否有等效选项。