13

objcopy実行可能ファイルにテキストファイルのバイナリ形式を含めるために使用することにしました。(実行時にファイルを文字列として必要とします)。これは、リンカがシンボル名から参照を見つける必要があるまでは正常に機能します。問題はobjcopy、ファイルへのパス名の前にシンボル名を追加することです。私はGNUAutotoolsを使用してパッケージを出荷しているため、この先頭に追加されたパス名が変更され、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リンカーシンボルとしてファイル名の語幹だけを私たちに伝えるにはどうすればよいですか?または、問題を回避する別の方法はありますか?

4

5 に答える 5

10

やや皮肉なことに、シンボルの名前を変更できるオプションを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
于 2013-05-03T08:27:57.197 に答える
5

私が使用した別の方法はcd、ソース ディレクトリに移動し、ソースobjcopyのベース名を指定することです。ではbash、これは次のようになります。

cd $(dirname $SOURCE)
objcopy ... $(basename $SOURCE) $TARGET

このようにして、生成されたシンボルには常に_binary_file_name_xxxパスがありません。

于 2014-04-23T14:55:26.810 に答える
-2

簡単な解決策の 1 つは、テキスト ファイルを char の配列の初期化に使用できるものに変換することです。したがって、「ABC012」の場合は 0x41,0x42,0x43,0x30,0x31,0x32 になります。次に、この一連のバイトを #include できます。すべてをバイトに変換する代わりに、すべての非 ASCII 文字をエスケープして、生成されたインクルード ファイルでほとんどのテキストを読み取ることができます

于 2013-03-24T08:06:21.897 に答える