我试图使用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
libtest.a
是使用以下代码生成的(从Makefile.am中提取):
SUFFIXES = .txt
.txt.$(OBJEXT):
objcopy --input binary --output elf32-i386 --binary-architecture i386 $< $@
我该如何告诉objcopy
仅使用文件名的主干作为链接符号?或者是否有其他解决方法?
--redefine-sym
是一个好主意,但似乎不够:objcopy的调用者如何知道如何形成“原始”的符号名称?我注意到,如果objcopy的输入文件是像../../foo/bar.txt
这样的东西,那么符号名称就会变成像_binary________foo_bar_txt_start
这样可怕的东西。不得不编码将点、斜杠和可能的其他字符(哪些?)转换为下划线的逻辑似乎相当愚蠢。而且奇怪的是,objcopy的--wildcard
选项可以帮助我们,但它似乎在--redefine-sym
中没有任何效果(我想他们打算用于其他用途)。 - John Zwinck_
。因此,以下代码将文件名转换为echo -n "$filename" | tr -c '[A-Za-z0-9]' '_'
。在文件名前加上_binary_
,在后面添加_start
和其他内容。 - Mitar