やや皮肉なことに、シンボルの名前を変更できるオプションをobjcopy
介して問題を解決するために使用できます...--redefine-sym
objcopy を使用して、別のディレクトリにある PNG からオブジェクト ファイルを作成する場合:
$ objcopy -I binary -O elf64-x86-64 -B i386 --rename-section .data=.rodata,alloc,load,data,contents,readonly ../../resources/test.png test_png.o
結果のオブジェクトには、次の記号があります。
$readelf -s test_png.o -W
Symbol table '.symtab' contains 5 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 SECTION LOCAL DEFAULT 1
2: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 1 _binary_______resources_test_png_start
3: 0000000000003aaa 0 NOTYPE GLOBAL DEFAULT 1 _binary_______resources_test_png_end
4: 0000000000003aaa 0 NOTYPE GLOBAL DEFAULT ABS _binary_______resources_test_png_size
これらは名前を変更できます。
$objcopy --redefine-sym _binary_______resources_test_png_start=_binary_test_png_start test_png.o
$objcopy --redefine-sym _binary_______resources_test_png_size=_binary_test_png_size test_png.o
$objcopy --redefine-sym _binary_______resources_test_png_end=_binary_test_png_end test_png.o
PNG が現在のディレクトリにある場合に objcopy が生成するシンボル名を持つオブジェクトが生成されます。
$readelf -s test_png.o -W
Symbol table '.symtab' contains 5 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 SECTION LOCAL DEFAULT 1
2: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 1 _binary_test_png_start
3: 0000000000003aaa 0 NOTYPE GLOBAL DEFAULT 1 _binary_test_png_end
4: 0000000000003aaa 0 NOTYPE GLOBAL DEFAULT ABS _binary_test_png_size