glibc предоставляет backtrace()
и backtrace_symbols()
, чтобы получить трассировку стека запущенной программы. Но для этого программа должна быть построена с флагом -rdynamic
линкера.gcc debug symbols (-g flag) vs linking -rdynamic option
В чем разница между -g
флагом, переданным gcc vs linker's -rdynamic
флагом? Для примера кода я действительно прочитал, чтобы сравнить выходы. -rdynamic
, похоже, дает больше информации под Symbol table '.dynsym'
Но я не совсем уверен, что это за информация.
Даже если I strip
программа, построенная с использованием -rdynamic
, backtrace_symbols()
продолжает работать.
Когда strip
удаляет все символы из двоичного кода, почему он оставляет все, что было добавлено флагом -rdynamic
?
Edit: Последующий вопросы, основанные на ответ Мэта ниже ..
Для того же образца кода вы взяли это различие я вижу -g
& -rdynamic
без опции ..
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 [email protected]_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
с -g
есть больше разделов, больше записей в .symtab
таблица, но .dynsym
остается такой же ..
[26] .debug_aranges PROGBITS 0000000000000000 0000095c
0000000000000030 0000000000000000 0 0 1
[27] .debug_pubnames PROGBITS 0000000000000000 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 [email protected]_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
с -rdynamic
никаких дополнительными разделы отладки, .symtab запись не 70 (так же, как ваниль Gcc вызова), но больше .dynsym
записей ..
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 [email protected]_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
Теперь эти вопросы у меня есть ..
В gdb вы можете сделать bt, чтобы получить bactrace. Если это работает только с
-g
, зачем нам-rdynamic
для работы backtrace_symbols?Сравнивая дополнения
.symtab
с-g
& дополнений.dynsym
с-rdynamic
они не точно такой же .. Предоставляет ли либо один лучше отладочной по сравнению с другими? FWIW, размер производимого продукта выглядит следующим образом: с -g> с -rdynamic> без опцииЧто такое использование .dynsym? Это все символы, экспортируемые этим двоичным кодом? В этом случае почему foo входит в .dynsym, потому что мы не компилируем код как библиотеку.
Если я свяжу свой код с использованием всех статических библиотек, то для работы backtrace_symbols -rdynamic не требуется?
Так получилось, что трассировку, к сожалению, не использует символы отладки [если имеется], как и большинство других инструментов, в том числе БГД, Valgrind и т.д. –