gcc debug symbols (-g flag) vs linker -rdynamic option
glibc fornecebacktrace()
ebacktrace_symbols()
para obter o rastreamento da pilha de um programa em execução. Mas, para que isso funcione, o programa deve ser construído com o linker-rdynamic
flag.
Qual é a diferença entre-g
sinalizador passado para gcc vs linker-rdynamic
flag? Para um código de amostra, eu me preparei para comparar as saídas.-rdynamic
parece produzir mais informações emSymbol table '.dynsym'
Mas não sei bem quais são as informações adicionai
Mesmo se eustrip
um programa binário construído usando-rdynamic
, backtrace_symbols()
continuar a trabalhar
Quandostrip
remove todos os símbolos do binário, por que está deixando para trás o que foi adicionado pelo-rdynamic
flag?
Edit: Perguntas de acompanhamento com base na resposta de Mat abaixo ..
Para o mesmo código de exemplo que você tirou, esta é a diferença que vejo com-g
& -rdynamic
sem nenhuma opção ..
Symbol table '.dynsym' contains 4 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 218 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses
3: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
Symbol table '.symtab' contains 70 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000400200 0 SECTION LOCAL DEFAULT 1
2: 000000000040021c 0 SECTION LOCAL DEFAULT 2
with-g
há mais seções, mais entradas em.symtab
mesa mas.dynsym
continua o mesmo.
[26] .debug_aranges PROGBITS 0000000000000000 0000095c
0000000000000030 0000000000000000 0 0 1
[27] .debug_pubnames PROGBITS 000000000000,0000 0000098c
0000000000000023 0000000000000000 0 0 1
[28] .debug_info PROGBITS 0000000000000000 000009af
00000000000000a9 0000000000000000 0 0 1
[29] .debug_abbrev PROGBITS 0000000000000000 00000a58
0000000000000047 0000000000000000 0 0 1
[30] .debug_line PROGBITS 0000000000000000 00000a9f
0000000000000038 0000000000000000 0 0 1
[31] .debug_frame PROGBITS 0000000000000000 00000ad8
0000000000000058 0000000000000000 0 0 8
[32] .debug_loc PROGBITS 0000000000000000 00000b30
0000000000000098 0000000000000000 0 0 1
Symbol table '.dynsym' contains 4 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 218 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses
3: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
Symbol table '.symtab' contains 77 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000400200 0 SECTION LOCAL DEFAULT 1
with-rdynamic
nenhuma seção de depuração adicional, as entradas .symtab são 70 (o mesmo que a invocação do vanilla gcc), mas mais.dynsym
entradas ..
Symbol table '.dynsym' contains 19 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 218 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
2: 00000000005008e8 0 OBJECT GLOBAL DEFAULT ABS _DYNAMIC
3: 0000000000400750 57 FUNC GLOBAL DEFAULT 12 __libc_csu_fini
4: 00000000004005e0 0 FUNC GLOBAL DEFAULT 10 _init
5: 0000000000400620 0 FUNC GLOBAL DEFAULT 12 _start
6: 00000000004006f0 86 FUNC GLOBAL DEFAULT 12 __libc_csu_init
7: 0000000000500ab8 0 NOTYPE GLOBAL DEFAULT ABS __bss_start
8: 00000000004006de 16 FUNC GLOBAL DEFAULT 12 main
9: 0000000000500aa0 0 NOTYPE WEAK DEFAULT 23 data_start
10: 00000000004007c8 0 FUNC GLOBAL DEFAULT 13 _fini
11: 00000000004006d8 6 FUNC GLOBAL DEFAULT 12 foo
12: 0000000000500ab8 0 NOTYPE GLOBAL DEFAULT ABS _edata
13: 0000000000500a80 0 OBJECT GLOBAL DEFAULT ABS _GLOBAL_OFFSET_TABLE_
14: 0000000000500ac0 0 NOTYPE GLOBAL DEFAULT ABS _end
15: 00000000004007d8 4 OBJECT GLOBAL DEFAULT 14 _IO_stdin_used
16: 0000000000500aa0 0 NOTYPE GLOBAL DEFAULT 23 __data_start
17: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses
18: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
Symbol table '.symtab' contains 70 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000400200 0 SECTION LOCAL DEFAULT 1
2: 000000000040021c 0 SECTION LOCAL DEFAULT 2
Agora, estas são as perguntas que tenho ..
No gdb você pode fazer bt para obter o bactrace. Se isso funcionar com apenas-g
por que precisamos-rdynamic
para que backtrace_symbols funcione?
Comparando as adições a.symtab
com-g
e adições a.dynsym
com-rdynamic
eles não são exatamente os mesmos. Um dos dois fornece melhores informações de depuração em comparação com o outro? FWIW, o tamanho da saída produzida é assim: com -g> with -rdynamic> com nenhuma opção
Qual é exatamente o uso de .dynsym? São todos os símbolos exportados por este binário? Nesse caso, por que o foo está entrando no .dynsym porque não estamos compilando o código como uma bibliotec
Se eu vincular meu código usando todas as bibliotecas estáticas, então -rdynamic não será necessário para que o backtrace_symbols funcione?