rdynamic
2023. 1. 19. 13:16ㆍProgramming/Linux Programming
- 목차
반응형
linker option
rdynamic은 executable의 symbol을 노출합니다.
다음의 코드를 살펴보겠습니다.
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
/* Obtain a backtrace and print it to stdout. */
void
print_trace (void)
{
void *array[10];
size_t size;
char **strings;
size_t i;
size = backtrace (array, 10);
strings = backtrace_symbols (array, size);
printf ("Obtained %zd stack frames.\n", size);
for (i = 0; i < size; i++)
printf ("%s\n", strings[i]);
free (strings);
}
/* A dummy function to make the backtrace more interesting. */
void
dummy_function (void)
{
print_trace ();
}
int
main (void)
{
dummy_function ();
return 0;
}
위 코드를 실행하면 다음과 같이 stack 정보를 출력합니다.
Obtained 5 stack frames.
./a.out() [0x4006ca]
./a.out() [0x400761]
./a.out() [0x40076d]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0) [0x7f026597f830]
./a.out() [0x4005f9]
그런데 주소값만 출력될 뿐 무엇에 대한 주소인지 알 수가 없습니다.
이제 -rdynamic을 compile 시 추가하여 build 하게 되면, 실행 시 다음과 같이 주소 값에 더해 심볼 정보가 출력됩ㄴ디ㅏ.
(gc -rdynamic main.c)
Obtained 5 stack frames.
./a.out(print_trace+0x28) [0x40094a]
./a.out(dummy_function+0x9) [0x4009e1]
./a.out(main+0x9) [0x4009ed]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0) [0x7f85b23f2830]
./a.out(_start+0x29) [0x400879]
위 binary file을 readelf를 통해 살펴보면, symbol table 정보를 볼 수 있습니다.
readelf --dyn-syms main.out
Symbol table '.dynsym' contains 9 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND free@GLIBC_2.2.5 (2)
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.2.5 (2)
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND backtrace_symbols@GLIBC_2.2.5 (2)
4: 0000000000000000 0 FUNC GLOBAL DEFAULT UND backtrace@GLIBC_2.2.5 (2)
5: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __stack_chk_fail@GLIBC_2.4 (3)
6: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.2.5 (2)
7: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
8: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
반응형
'Programming > Linux Programming' 카테고리의 다른 글
makefile 주요 문법 (0) | 2025.01.03 |
---|---|
cmake ctest 에서 test fail 시 log 출력 (0) | 2023.01.27 |
libfmt fPIC로 build 하기 (0) | 2022.12.27 |
CMake에서 cross compiler 지정 (0) | 2022.10.06 |
gdbus] method 등록 및 호출 (0) | 2021.09.27 |