프로파일링이나 함수 래핑으로 lock등의 작업을 가로채서 로깅할 때 호출한 쪽의 PC값을 알고 싶을 경우가 있습니다.
현재실행되는 함수 입장에서 보면 리턴 주소이죠
이 때 쓸 수 있는 함수가 gcc의 builtin함수로 __builtin_return_address() 입니다.
__builtin_return_address(level)
여기서 level은 call stack 에서 몇번째를 리턴할 것인지에 대한 값입니다.
__builtin_return_address(0) 하면 현재함수의 리턴주소가 나옵니다.
__builtin_return_address(1) 하면 나를 호출한 함수의 리턴주소가 나옵니다...
예제 코드를 짜봤습니다.
#include <stdio.h> int my_func1() int main(void) |
이 소스코드를 컴파일해서 objdump해보면
080483d1 <my_func0>: 08048403 <main>: 804845c: e8 70 ff ff ff call 80483d1 <my_func0> |
이와 같이 호출하게 되어있고
실행해보면
backtrace test |
이렇게 나옵니다. call 바로 다음 주소--리턴 주소가 나오지요.
이외에도 몇가지 builtin함수들이 있습니다.
예를 들어 __builtin_frame_address(level)은 프레임 포인터를 반환합니다.
관련 포스트 :
2010/01/29 00:47 [수정/삭제] [답글]
관리자만 볼 수 있는 댓글입니다.