2017-01-05 6 views

答えて

2

これら2つのセクションの違いは何ですか?

これらはお互いに関係ありません。

どちらも文字列を含んでいますか?

セクションにはすべてバイトが含まれているので、次に「.text.dataの違いは何ですか?」と尋ねられます。

.debug_strセクションには、デバッグに必要なデバッグ文字列が含まれています。 .strtabセクションには、(静的な)リンクに必要なシンボル名が含まれています。

実行時にどちらのセクション(実際にはセクション)も必要ありません。

なぜ.strtabは、最終的な実行ファイルに-gでリンクされているのですか(スタティックリンクにはもう使用されません)。

  1. .strtabそれはデバッグに役立つために、本の最後で構築された実行可能ファイルまたは
  2. -gなしと
  3. 中に通常存在しています。考えてみましょう:それは
 
int foo() { abort(); } 
int bar() { return foo(); } 
int main() { return bar(); } 

gcc t.c 
strip a.out -o a.stripped 

gdb -q ./a.stripped 
(gdb) run 
Starting program: /tmp/a.stripped 

Program received signal SIGABRT, Aborted. 
0x00007ffff7a4bc37 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. 
(gdb) bt 
#0 0x00007ffff7a4bc37 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
#1 0x00007ffff7a4f028 in __GI_abort() at abort.c:89 
#2 0x0000000000400536 in ??() 
#3 0x0000000000400544 in ??() 
#4 0x0000000000400554 in ??() 
#5 0x00007ffff7a36f45 in __libc_start_main (main=0x400546, argc=1, argv=0x7fffffffde58, init=, fini=, rtld_fini=, stack_end=0x7fffffffde48) at libc-start.c:287 
#6 0x0000000000400469 in ??() 

ない非常に便利な、ありますか?

gdb -q ./a.out 
(gdb) r 
Starting program: /tmp/a.out 

Program received signal SIGABRT, Aborted. 
0x00007ffff7a4bc37 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. 
(gdb) bt 
#0 0x00007ffff7a4bc37 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
#1 0x00007ffff7a4f028 in __GI_abort() at abort.c:89 
#2 0x0000000000400536 in foo() 
#3 0x0000000000400544 in bar() 
#4 0x0000000000400554 in main() 
+0

完全性のために、.strtabが '-g'でリンクされた最終実行ファイルに存在するのはなぜですか(静的リンクにはもう使用されません)。 – yugr

+1

@yugr答えを更新しました。 –

関連する問題