2011-02-03 9 views
3

특수 섹션 (__dlog)에 문자열을 저장하여 ELF 실행 파일에 메타 데이터를 추가하려고합니다. 현재 접근법은 인라인 어셈블리를 사용하여 문자열을 저장하고 원하는대로 거의 작동합니다.인라인 어셈블리에서 __func__을 사용하는 방법

#include <stdio.h> 
#include <stdlib.h> 

#define DLOG(proto...) \ 
     __asm__(".pushsection __dlog, \"S\", @note\n\t" \ 
       ".asciz \"" __FILE__ ":function_name_here:" #proto "\"\n\t" \ 
       ".popsection\n\t") 

int 
foo(int bar) 
{ 
    int baz = bar/2; 
    DLOG(int baz); 
    return baz; 
} 

int 
main(int argc, char *argv[]) 
{ 
    foo(argc); 
    return EXIT_SUCCESS; 
} 

그러나 이상적으로는, 매크로가 자동으로 __func__ 식별자를 활용하여 문자열의 일부로서 함수 이름을 포함해야합니다. 최종 결과는섹션에

file.c:foo:int baz\0 

문자열이어야합니다. 그러나 __func__ 이후 문자열 GCC는 문자열에 추가 __func__의 내용을 얻을 수 어쨌든 거기에이 코드

".asciz \"" __FILE__ ":" __func__ ":" #proto "\"\n\t" 

과 불평, 문자 아닌가요? 솔루션이 사용자 정의 빌드 옵션이나 사후 처리 단계를 필요로하지 않는다면 보너스 포인트. 컴파일러는 gcc 4.4와 4.5입니다. 이것은 작동하는 것 같다, 그것은 완전 해제 망가 이름을 제공하지 않지만, 함수 이름이

#define DLOG(proto...) \ 
__asm__(".pushsection __dlog, \"S\", @note\n\t" \ 
       ".asciz \"" __FILE__ ":%0:" #proto "\"\n\t" \ 
       ".popsection\n\t" \ 
: \ 
: "s" (__func__)) 


int main(int argc, char*argv[]) { 
DLOG(int argc, char*argv[]); 

return 0; 
} 

extern "C" void test(int bar) { 
DLOG(bar); 
} 

g ++입니다 - 4.4 Test.cpp에 & & xxd의 a.out의 | :

답변

3
편집

적은 -p Test.cpp에

0001020: 7465 7374 2e63 7070 3a24 5f5a 5a34 6d61 test.cpp:$_ZZ4ma 
0001030: 696e 4538 5f5f 6675 6e63 5f5f 3a69 6e74 inE8__func__:int 
0001040: 2061 7267 632c 2063 6861 722a 6172 6776 argc, char*argv 
0001050: 5b5d 0074 6573 742e 6370 703a 245f 5a5a [].test.cpp:$_ZZ 
0001060: 3474 6573 7445 385f 5f66 756e 635f 5f3a 4testE8__func__: 
0001070: 6261 7200 4743 433a 2028 5562 756e 7475 bar.GCC: (Ubuntu 

원래 답변 : GCC-3.3에서

C 모드를 사용하여이 __func__const char []처럼 취급된다. C++ 모드 및 gcc> 3.3 인 경우 __func__은 항상 변수입니다.

이전 버전의 gcc를 c-mode로 사용하면 가능합니다.

는`__PRETTY_FUNCTION__`를 사용하는 당신이하려는 unmangled C++ 이름을 원하는 잘 경우 http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html

+0

의 마지막 단락을 참조하십시오. – user562374

+0

@user가 작동하지 않습니다. 어쨌든'printf ("% s \ n", __ func __)'는 내 함수가'extern "C"'이므로 엉뚱한 이름을 출력합니다. 이름을 맹 글링하는 것은 어셈블러입니다. 어쩌면 그것은 dll (따라서 내 보낸 기호를 보존해야했다) – KitsuneYMG

+0

아니요. '--shared'는 문제를 해결하지 않습니다 – KitsuneYMG

관련 문제