I am tying to use objcopy
to include a binary form of a text file into an executable. (At runtime I need the file as a string). This works fine until the linker needs to find the references from the symbol names. The problem is that objcopy
prepends the symbol names with the pathname to the file. Since I am using GNU Autotools to ship the package this prepended pathname changes and I don't know what external linker symbol to use in the C/C++ program.
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
was produced with (extract from Makefile.am):
SUFFIXES = .txt
.txt.$(OBJEXT):
objcopy --input binary --output elf32-i386 --binary-architecture i386 $< $@
How can I tell objcopy
to only us the stem of the filename as linker symbols? Or is there another way around the problem?
--redefine-sym
is a good one, but it seems insufficient: how is the caller of objcopy supposed to know how to form the "original" symbol name? I note that if the input file to objcopy is something like../../foo/bar.txt
the symbol name is something horrible like_binary________foo_bar_txt_start
. Having to encode the logic to turn dots, slashes, and perhaps other characters (which?) into underscores seems pretty silly. And bizarrely, objcopy's--wildcard
option could help us, but it seems to have no effect with--redefine-sym
(I suppose they intend it for other uses). – Amorist