특수 섹션 (__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의 | :
의 마지막 단락을 참조하십시오. – user562374
@user가 작동하지 않습니다. 어쨌든'printf ("% s \ n", __ func __)'는 내 함수가'extern "C"'이므로 엉뚱한 이름을 출력합니다. 이름을 맹 글링하는 것은 어셈블러입니다. 어쩌면 그것은 dll (따라서 내 보낸 기호를 보존해야했다) – KitsuneYMG
아니요. '--shared'는 문제를 해결하지 않습니다 – KitsuneYMG