'objdump'에 해당되는 글 2건

  1. 2009.05.26 binutils - ar, nm, objdump
  2. 2009.02.23 elf format 분석용 binutils - objdump, readelf, ldd (4)
libjpeg.a 라는 녀석을 발견하고는 어떻게 생겼나 궁금증이 생겼다.

$ ll libjpeg.a
-rw-r--r-- 1 root root 166012 2007-10-01 23:36 libjpeg.a

$ file libjpeg.a
libjpeg.a: current ar archive

$ nm -A libjpeg.a
libjpeg.a:jcapimin.o:00000330 T jpeg_CreateCompress
libjpeg.a:jcapimin.o:         U jpeg_abort
libjpeg.a:jcapistd.o:         U jinit_compress_master
libjpeg.a:jcapistd.o:000001b0 T jpeg_start_compress
libjpeg.a:jctrans.o:000000c0 t compress_output
libjpeg.a:jctrans.o:         U jinit_c_master_control
libjpeg.a:jcparam.o:000008a0 t add_huff_table
libjpeg.a:jcparam.o:000000e2 r bits_ac_chrominance.3846
... 파일별로 반복
'
U,T,r 등은 symbol type 이라고 하며,
위의 U는 Undefined 을, T는 Text section(code) 을 의미한다.

$ nm --help


$ man nm (DESCRIPTION)


$ ar -t libjpeg.a
jcapimin.o
jcapistd.o
jctrans.o
jcparam.o
jdatadst.o
...

$ ar --help


$ objdump -x libjpeg.a
In archive libjpeg.a:

jcapimin.o:     file format elf32-i386
rw-r--r-- 0/0   2296 Oct  1 23:36 2007 jcapimin.o
architecture: i386, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x00000000

Sections:
SYMBOL TABLE:
RELOCATION RECORDS FOR [.text]:
... 파일별로 반복

$ objdump --help



mangling은 컴파일러에서 이름이 중복되지 않도록 독특한 이름을 지어주는 것으로
C++에서 overloading을 지원하기 하는데 사용되기도 한다고 한다. [링크 : http://rubyeye.kr/]

int _cdecl    f (int x) { return 0; }	//	_f
int _stdcall  g (int y) { return 0; }	//	_g@4
int _fastcall h (int z) { return 0; }	//	@h@4

위키피디아에서 참조한 녀석으로 MS 컴파일러가 C언어 맹글링하는 방식의 예제이다.
[링크 : http://en.wikipedia.org/wiki/Name_mangling]

그리고 이러한 녀석을 원래이름으로 돌려주는 유틸리티로 c++filt가 존재한다.
[참고 : http://kldp.org/node/68410]

$ c++filt --help


신고

'Programming > C / Win32 / MFC' 카테고리의 다른 글

indent style  (0) 2009.06.09
C99 구조체 초기화 하기  (0) 2009.05.28
binutils - ar, nm, objdump  (0) 2009.05.26
신기한 코드 사이즈  (0) 2009.05.19
double형을 int 형으로 출력하면?  (0) 2009.05.15
전처리기를 이용한 디버깅용 선언문(#define)  (0) 2009.05.15
Posted by 구차니

댓글을 달아 주세요

Linux2009.02.23 17:34
카페에서 우연히 주워들은 프로그램이름인데..
검색해보니 readelf가 조금 더 분석에 강력하다고 한다.

#include <stdio.h>

void main()
{
        unsigned char b = 0xF1;
        unsigned short c = 0xF1;
        unsigned int d = 0xF1;

        printf("%X\n",b);
        printf("%X\n",c);
        printf("%X\n",d);
}


위의 소스를 분석한 내용이다. 내용이 많으므로 눌러서 보기바람.

$ gcc -S test.c
$ more test.s

더보기


$ gcc -Wl,-Map -Wl,test.map test.c
$ more test.map

더보기


$ gcc test.c
$ objdump -x a.out

더보기


$ readelf -a a.out

더보기


$ ldd a.out

더보기


솔찍히 머가 먼지 모르겠다.

덧 : 생각해보니 이것저것 생각나는거 다 붙이다 보니 제목이 안 맞네 ㄱ- 바꿔야 하나?
신고
Posted by 구차니

댓글을 달아 주세요

  1. 헥.. 분석은 뭐하는건가요??? 거 참 길기도 하네요.
    저는 C언어는 코딩하고 컴파일 하는 것 밖에 모르는데...
    하여튼 원리에 대해서 깊게 파고 들어가시는가 봅니다.

    2009.02.23 22:33 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 분석이라고 함은 두가지로 나뉩니다. reverse engineering을 위한분석과, 문제점 해결을 위한 분석으로 말이죠. 리버스엔지니어링은 나쁜 목적과 좋은 목적이 있는데, 나쁜 목적으로는 시리얼키 해킹이라던가 이런 것이 있고, 좋은 목적으로는 이미 만들어진 제품을 업그레이드 해야할 필요가 있을떄 하지만 프로그램 소스가 없을때 행해집니다.
      문제점 해결을 위한 분석은, 원인을 알 수 없는 프로그램 다운을 해결하기 위해서 프로그램의의 특정 부분이 어느 메모리에 존재하고 어떠한 작동으로 어떤 메모리 부분을 침범하는지 등을 체크하고, 죽을때 뱉어 내는 메시지가 어느 부분에서 죽었기 때문에 나타나는지를 알아내기 위해서 보는 거랍니다.

      아직 저도 갈길이 멀어서 이정도로 밖에 추상적으로 설명을 해드릴수는 없어서 죄송하네요 ㅠ.ㅠ
      언넝 열심히 파고 들어야겠습니다.

      2009.02.23 22:41 신고 [ ADDR : EDIT/ DEL ]
    • 헥헥.. 하여간 프로그래밍은 끝이 없네요. ㅎㅎ 뭐.. '디버그'같은 건가요?

      지금도 충분히 엄청난 내공의 소유자이시네요.
      CD마니님 처럼요... ㅎㅎㅎ

      2009.02.24 10:41 신고 [ ADDR : EDIT/ DEL ]
    • 아직 많이 부족해요 ^^;

      2009.02.24 10:54 신고 [ ADDR : EDIT/ DEL ]