objcopy는 오브젝트 파일을 다른 오브젝트 파일로 복사할 때 사용한는데, 선택적으로 필요한 부분만을 복사할 수 있기 때문에 파일의 사이즈를 줄이는 데 주로 사용되고, 바이너리 포맷을 바꾸는 데도 이용된다.

 

 ex) objcopy hello hello.new

 

hello 파일을 hello.new로 복사, 기존의 hello와 동일하다.

 

 

 ex) objcopy -O binary hello hello.new

 

위 명령은 hello 파일에서 인스트럭션과 데이터만을 뽑아서 hello.new로 만든다. 이렇게 만들어진 hello.new는 ELF 헤더도 붙지 않은 순수한 바이너리 그 자체다. 주로 부트 로더를 만들 때 이런 식으로 사용하는데 이유는 모든 CPU마다 전원이 인가되었을 때 CPU가 인스트럭션을 처음 읽어서 실행할 번지가 정해져 있다. 예를 들면 i386 계열은 0xfffffff0 번지이고 ARM 계열 CPU는 0x0 번지며 MPC860 CPU 같은 경우 0xff00100번지다.

 

무슨 말이냐하면 i386 계열 CPU는 전원이 켜지는 순간 BIOS의 POST(Power On Self Test) 프로그램이 위치하는 0xfffffff0 번지의 인스트럭션을 제일 처음 읽어서 수행한다.

 

i386 PC 외의 CPU 같은 경우 처음 수행하는 프로그램은 부트 로더인데 이러한 부트 로더는 인스트럭션이 제일 앞에 와있는 바이너리여야 한다. 즉 ELF 헤더가 붙어서는 안 된다는 이야기다. ELF 헤더는 운영체제에서 필요한 정보지 CPU에서 필요한 정보는 아니다.

 

 

ex) objcopy -S hello hello.new

 

모든 심볼들과 재비치 정보들을 제거하여 hello.new 파일을 만든다. 그래서 바이너리 파일의 사이즈가 확실히 줄어든다.

 

 

-  참고 문헌 : 유닉스, 리눅스 프로그래밍 필수 유틸리디

[출처] objcopy|작성자 레토브


+ Recent posts