2017-03-17 10 views
1

기본/숨김 가시성에 대해서만 염려합니다.
.o 파일은 IPO로 컴파일되지 않습니다.오브젝트 파일 (.o)에서 함수 심볼의 가시성 확인

.o 파일에서 기호의 가시성을 찾는 방법은 무엇입니까?

왜 내가 .o 파일에서 그것을 찾아야 만합니까 :
특정 플랫폼에서 문제가있는 gcov.a를 만났습니다.
그리고 어디가 잘못되었는지 알아 내야합니다.
1. 툴체인이 얼마나 정확하게 구성되고 구축되었는지 알 수 없습니다.
2. libgcc 마법의 일부로 소스 코드에서 찾아내는 것이 매우 어렵습니다.

+0

nm 명령을 사용해 보셨나요? – codeforester

답변

1

objdump -t 인 파일의 기호 표 을 검사하여 개체 파일에서 기호의 표시 여부를 확인할 수 있습니다. 기호가 hidden 인 경우 해당 objdump 레코드의 여섯 번째 필드에 .hidden 레이블이 붙고 이 그 이름으로 붙습니다. 가시성이 default이면 해당 레이블이없고 여섯 번째 필드가 이름이됩니다 (일반적인 경우). 예를 들어 :

foo.c를 (기본 가시성)

#include <stdio.h> 

void foo(void) 
{ 
    puts("foo"); 
} 

컴파일 및 검사 :

$ gcc -c -fPIC foo.c 
$ objdump -t foo.o | grep foo 
foo.o:  file format elf64-x86-64 
0000000000000000 l df *ABS* 0000000000000000 foo.c 
0000000000000000 g  F .text 0000000000000013 foo 

foo.c를 (숨겨진 가시성)

#include <stdio.h> 

__attribute__ ((visibility ("hidden"))) void foo(void) 
{ 
    puts("foo"); 
} 

을 다시 컴파일하고 다시 검사하십시오.

$ gcc -c -fPIC foo.c 
$ objdump -t foo.o | grep foo 
foo.o:  file format elf64-x86-64 
0000000000000000 l df *ABS* 0000000000000000 foo.c 
0000000000000000 g  F .text 0000000000000013 .hidden foo 
+1

일반적으로 'objdump'를 ELF 시스템에서 사용하는 것은 실수입니다 : 대신에'readelf '를 사용하십시오. 'objdump'는'COFF'에서 왔으며, 세계의 모델은 시대에 뒤쳐져 있습니다. ELF의 단순한 개념을 단순화 된 세계관으로 되돌릴 때 당신에게 거짓말을합니다. –