答え1
strip
バイナリ記号がpedされていますか?その場合、シンボルテーブルもなく、シンボルを見つける可能性もありません。readelf
私のhello
バイナリはここで見つけることができます。するシンボルテーブルがあります:
$ readelf -S hello | grep -i symtab
[28] .symtab SYMTAB 0000000000000000 000018f8
$
また、GDBを実行するとプログラムは実際に起動しますか?シンボルテーブルがロードされるまで、このシンボルを確認できないようです。 GDBを初めて起動するときはロードされませんが、クリックするとロードする必要がありますmain()
。main()
プログラムにブレークポイントを配置してrun
ブレークmain()
ポイントに達すると、変数を調べることができます。
Reading symbols from hello...(no debugging symbols found)...done.
(gdb) x/s *((char **)environ)
No symbol table is loaded. Use the "file" command.
(gdb) b main
Breakpoint 1 at 0x4005c8
(gdb) r
Starting program: /home/ubuntu/hello
Breakpoint 1, 0x00000000004005c8 in main ()
(gdb) x/s *((char **)environ)
0x7fffffffe38f: "XDG_VTNR=7"
(gdb)
答え2
でgdb
コマンドを使用できますshow environment
。プロセス環境を確認する代替方法は次のとおりです。
$ sed 's/\x0/\n/g' /proc/<PID>/environ
このsed
コマンドは、読みやすくするために NUL 区切り文字を改行に変換するために必要です。
2つのアプローチの利点(簡単さに加えて)は、シンボルテーブルが削除されても問題にならないことです。 :-)