2016-09-23 8 views
5

nasm을 사용하여 객체를 어셈블 할 때 최종 레이블과 최종 결과 인 .o 파일에 모든 레이블이 기호로 포함되어 있음을 발견했습니다.모든 asm 레이블이 실행 가능 파일의 기호가 됨

이것은 내가 GLOBAL으로 선언 한 함수 엔트리 포인트와 섹션 시작 부분 (예 : .text 섹션)에 대해 의미가 있지만, 루프 엔트리 포인트로 사용되는 라벨이 거의 보이지 않는 것처럼 보입니다. 출력 파일에. 내부 구현 세부 사항을 유출하는 것 외에도 심볼 테이블의 공간을 낭비합니다. 이 짧은 조립 프로그램 주어진 예를 들어

:

GLOBAL _start 
_start: 
    xor eax, eax 
normal_label: 
    xor eax, eax 
.local_label: 
    xor eax, eax 
    xor edi, edi 
    mov eax, 231 ; exit(0) 
    syscall 

는 ... 사용하여 구축 :에

nasm -f elf64 label-test.s 
ld label-test.o -o label-test 

결과를 l (즉, 로컬) 오브젝트 파일과 링크 된 실행 파일을 모두 심볼 :

objdump --syms label-test.o 

label-test.o:  file format elf64-x86-64 

SYMBOL TABLE: 
0000000000000000 l df *ABS* 0000000000000000 label-test.s 
0000000000000000 l d .text 0000000000000000 .text 
0000000000000002 l  .text 0000000000000000 normal_label 
0000000000000004 l  .text 0000000000000000 normal_label.local_label 
0000000000000000 g  .text 0000000000000000 _start 

normal_label 및 th e 로컬 라벨 local_label은 기호 테이블에서 끝났습니다. 그들 모두는 실행 파일의 심볼 테이블에서도 끝납니다.

이 기호를 최종 실행 파일로 내보내고 싶지 않습니다. nasm에게 그들을 포함시키지 말라고 할 수 있습니까? ld으로 전달할 수있는 옵션이 있습니다 (예 : --strip-all). 이러한 기호는 제거되지만 실행 파일의 기호는 모두 개입니다. 즉에게 꽤 곤장을한다 : 그것은 등 정말 읽을 스택 추적, 디버깅을 위해 유지하려는 기호, 피터 코르에서 언급 한 바와 같이


FWIW, yasm 정확히 같은 문제가되지 않습니다를 제거합니다. 위와 동일한 방식으로 구축 된 elf64 .o 파일 (그러나 nasm 대체 yasm, 우리가 얻을 :

objdump --syms label-test-yasm.o 

label-test-yasm.o:  file format elf64-x86-64 

SYMBOL TABLE: 
0000000000000000 l df *ABS* 0000000000000000 label-test.s 
0000000000000004 l  .text 0000000000000000 
0000000000000002 l  .text 0000000000000000 
0000000000000000 l d .text 0000000000000000 .text 
0000000000000000 g  .text 0000000000000000 _start 

가 글로벌 _start 라벨이 여전히 포함되어 있지만 다른 두 레이블 이름이되지 않습니다 - 그들은 그래도 그들은 여전히 ​​4 자리와 2 자리에있는 이름없는 기호입니다 (위 목록의 2 줄과 3 줄). 이것은 더 많은 레이블을 추가하여 확인됩니다 - 더 많은 미가공 기호가 생성됩니다 -

+0

yasm은 기본적으로 그렇게하지 않습니다. ('-gdwarf2'를 사용하면된다.) –

+1

허, 그래. 어쩌면 약간의 불편 함이있을 수 있습니다. 나는 그 질문의 맨 아래에 추가했다. 당신은'-g '라고 언급하고 나에게 이것은 디버깅을 위해 추가 된 것이지만,'ld' 명령에있는'--strip-debug'는 그것들을 제거하지 않는다는 것을 주목할 필요가 있습니다. nasm에 의해 빌드 된 바이너리. – BeeOnRope

+0

글쎄, 이번에는 좀 더 세게 봤어. 그냥 [nasm의 한계] (https://forum.nasm.us/index.php?topic=1951.0)처럼 보일 것 같다. – BeeOnRope

답변

3

제가 알 수있는 한 , 그것은 단지 nasm의 한계입니다. 예를 들어 this forum post 포스터와 거의 동일한 문제가 있습니다 (32 비트보다는 64 비트 ELF), 스트리핑 도구를 사용하는 것 외에는 솔루션이 제공되지 않습니다. 트릭을 할해야

strip --discard-all label-test.o 

: 내 경우

, 그것은 같은 오브젝트 파일을 제거 보인다. --discard-all 옵션의 이름에도 불구하고 로컬 기호 만 제거하고 전역 기호 만 남겨 둡니다.여기에 파일을 제거하기 전에 심볼 테이블을이다 :

SYMBOL TABLE: 
0000000000000000 l df *ABS* 0000000000000000 label-test.s 
0000000000000000 l d .text 0000000000000000 .text 
0000000000000002 l  .text 0000000000000000 normal_label 
0000000000000004 l  .text 0000000000000000 normal_label.local_label 
0000000000000000 g  .text 0000000000000000 _start 

이후 : 혼자 .text 섹션 기호를 떠날만큼 영리했다 특히

SYMBOL TABLE: 
0000000000000000 l df *ABS* 0000000000000000 label-test.s 
0000000000000000 l d .text 0000000000000000 .text 
0000000000000000 g  .text 0000000000000000 _start 

참고,이 지역 임에도 불구하고. 물론이 스트립 옵션은 쓸모없는 (루프 레이블)과 잠재적으로 유용한 기호를 구분할 수 없습니다. 예를 들어 다양한 도구로 올바른 스택 추적을 제공하는 데 필요한 로컬 함수 엔트리 포인트가 있습니다. 당신이 그것에 대해 똑똑하고 싶었다면

, 당신은 선택적으로 선택적으로 내장 . 만 라벨을 제거하기 위해 --wildcard--strip-symbol 옵션을 사용하여 단지 ASM-지역 (A .로 시작하는 즉, 라벨)을 제거 할 수있다.

나는 거기에 숨어있는 경우 더 나은 대답을 찾고 있습니다.