2017-01-05 3 views

Répondre

2

Quelle est la différence entre ces deux sections?

Ils n'ont ~ rien à faire les uns avec les autres.

Les deux contiennent des chaînes, non?

Eh bien, oui. Et chaque section contient des octets, de sorte que vous demanderez ensuite "quelle est la différence entre .text et .data?".

La section .debug_str contient des chaînes de débogage nécessaires au débogage. La section .strtab contient les noms de symboles nécessaires pour la liaison (statique).

Aucune section (en fait aucune section) n'est requise lors de l'exécution.

pourquoi .strtab est présent dans exécutable final lié à -g (même si elle ne sera pas utilisé pour relier plus statique)?

  1. Le .strtab est généralement présent dans exécutable final construit avec ou sans -g et
  2. Il est présent pour faciliter le débogage. Considérez:
 
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 ??() 

Pas très utile, est-il? Comparer binaire unstripped:

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

Pour être complet, pourquoi .strtab est présent dans exécutable final lié à '-g' (même si elle ne sera pas utilisé pour relier plus statique)? – yugr

+1

@yugr J'ai mis à jour la réponse. –