티스토리 뷰
728x90
윈도우에 실행 파일이 PE 포멧이듯, 리눅스에는 ELF 포멧이 기본이다. 아래는 relocatable 파일(쉽게 말하면 오브젝트 파일)의 심볼테이블 (변수나 함수)를 링커에서 사용하는데 아래의 명령어들로 화면에 출력해 볼 수 있다.
1. readelf -s main.o
리눅스에서는 대부분 오브젝트 파일을 elf 포멧으로 생성하므로 아래의 readelf를 사용할 수 있다.
- 아래를 보면 section에 대한 정보가 나오지만 어떤 심볼이 어떤 섹센에 포함된지 이해하기 힘들다.
- buf, main이 global symbol 이다.
- swap, printf가 external 이다. global + UND 정의되지 않는 심볼
Symbol table '.symtab' contains 8 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS main.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1 .text
3: 0000000000000000 0 SECTION LOCAL DEFAULT 5 .rodata
4: 0000000000000000 8 OBJECT GLOBAL DEFAULT 3 buf
5: 0000000000000000 59 FUNC GLOBAL DEFAULT 1 main
6: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND swap
7: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND printf
2. objdump -t main.o
디어셈블을 위한 -d 옵션 이외에도 symbok table을 조회하는 기능을 제공한다.
- 좀 더 이해하기 쉽게 표현되어 있다. assembly 코드와 거의 유사하기 때문이다.
- buf는 .data에 속한 초기화된 global symbol이다. main은 F(함수)로 .text 섹션에 포함된 실행 코드이다.
- swap, printf는 정의되지 않았으므로 external 심볼이다.
main.o: file format elf64-x86-64
SYMBOL TABLE:
0000000000000000 l df *ABS* 0000000000000000 main.c
0000000000000000 l d .text 0000000000000000 .text
0000000000000000 l d .rodata 0000000000000000 .rodata
0000000000000000 g O .data 0000000000000008 buf
0000000000000000 g F .text 000000000000003b main
0000000000000000 *UND* 0000000000000000 swap
0000000000000000 *UND* 0000000000000000 printf
3. nm main.o
일반적으로 가장 많이 사용하는 nm 명령어는 elf 포멧 섹션까지 분석해 주진 않는다.
- 아주 간단하게만 나와 있다. buf는 정의된 심볼, T는 text section에 속한다. printf, swap은 외부 심볼(미정의)
0000000000000000 D buf
0000000000000000 T main
U printf
U swap
728x90
'IT 관련 유용한 것들' 카테고리의 다른 글
Docker Debian 기반 이미지에서 apt update가 안될 때, vim 없을 때 (0) | 2024.05.07 |
---|---|
Mac (맥) 윈도우식 키매핑 (0) | 2024.04.30 |
Strapi 설치 PostgreSQL 데이터 베이스 사용하기 (0) | 2024.04.04 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
- 도커 개발환경 참고
- AWS ARN 구조
- Immuability에 관한 설명
- 자바스크립트 멀티 비동기 함수 호출 참고
- WSDL 참고
- SOAP 컨슈머 참고
- MySql dump 사용법
- AWS Lambda with Addon
- NFC 드라이버 linux 설치
- electron IPC
- mifare classic 강의
- go module 관련 상세한 정보
- C 메모리 찍어보기
- C++ Addon 마이그레이션
- JAX WS Header 관련 stackoverflow
- SOAP Custom Header 설정 참고
- SOAP Custom Header
- SOAP BindingProvider
- dispatcher 사용하여 설정
- vagrant kvm으로 사용하기
- git fork, pull request to the …
- vagrant libvirt bridge network
- python, js의 async, await의 차이
- go JSON struct 생성
- Netflix Kinesis 활용 분석
- docker credential problem
- private subnet에서 outbound IP 확…
- 안드로이드 coroutine
- kotlin with, apply, also 등
- 안드로이드 초기로딩이 안되는 경우
- navigation 데이터 보내기
- 레이스 컨디션 navController
- raylib
TAG
- hibernate
- Rest
- one-to-one
- Security
- 외부파일
- 상속
- XML
- Angular
- Spring
- 하이버네이트
- 스프링부트
- 스프링
- MYSQL
- 매핑
- mapping
- Spring Security
- WebMvc
- 로그인
- jsp
- spring boot
- 설정하기
- 설정
- Validation
- form
- 자바
- crud
- one-to-many
- RestTemplate
- login
- Many-To-Many
250x250