首页 > 代码库 > ELF解析(part one)

ELF解析(part one)

 

 

 

the contents

class elf {	//date structure	Elf32_Ehdr	ehdr;	Elf32_Shdr	shdr;	Elf32_Phdr	phdr;		//	void elf( void);	void ~elf( void);	void ehdr(void);	void shdr(void);	void phdr(void);	void StringTable(void);	void SymbolTable(void);	void Relocation(void);};


void elf::elf( void)

void elf::elf( void){/***	Recently, I read some data about elf ,executable and link format. There are some experiences I hope*	to share,  record it.And I know work behind closed doors is never a good way, So welcome to your *	advice at anytime,both in technique and in ENGLISH.*	the references is as following:*		ELF_format.pdf*		......*	actually ,read those articles is a better choice than this text.*	In this article I will not introduce some concepts in detail, but introduce some examples*	that help me understand its operating principles.*/}


void elf::ehdr(void)

void elf::ehdr(void){//what is elf header?/***	Any elf file have a elf header, that represent information about how to analyzing this file.*	it structure is */         typedef struct elf32_hdr {                  unsigned char e_ident[EI_NIDENT];	/* magic + "ELF"*/                  Elf32_Half e_type;				/* */                  Elf32_Half e_machine;			/* */                  Elf32_Word e_version;			/* */                  Elf32_Addr e_entry; 	/* Entry point of the program.For relocatable object file, it is zero*/                  Elf32_Off e_phoff;		/* program header tables' offset from the begin of the file to the first byte of this table*/                  Elf32_Off e_shoff;		/* section header tables' offset from the begin of the file to this table*/                  Elf32_Word e_flags; 	/* */                  Elf32_Half e_ehsize;	/* size of the ELF head*/                  Elf32_Half e_phentsize; /* size of a entry of program header*/                  Elf32_Half e_phnum; /* number of program header*/                  Elf32_Half e_shentsize; /* size of the section header entry*/                  Elf32_Half e_shnum; /* number of section header*/                  Elf32_Half e_shstrndx;	/* help section header table to find it's section header strings table, */        } Elf32_Ehdr;/**	now , To help our analysis, we need to create a simply example.*/#include <stdio.h>int main(){	printf("aaaaa\n");	return 0;}/**	compile it,and check it*/[root@localhost blog]# gcc main.c -o main[root@localhost blog]# readelf -h mainELF Header:  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00   Class:                             ELF32  Data:                              2 s complement, little endian  Version:                           1 (current)  OS/ABI:                            UNIX - System V  ABI Version:                       0  Type:                              EXEC (Executable file)  Machine:                           Intel 80386  Version:                           0x1  Entry point address:               0x80482b0  Start of program headers:          52 (bytes into file)  Start of section headers:          1912 (bytes into file)  Flags:                             0x0  Size of this header:               52 (bytes)  Size of program headers:           32 (bytes)  Number of program headers:         7  Size of section headers:           40 (bytes)  Number of section headers:         28  Section header string table index: 25/**	those informations are all from the structure above.see some interesting part:**	"Type:                    EXEC (Executable file)"*    --it tell us this file is a excutable file.Actually, elf file include three types :*		EXEC, DYN( shared object file), and REL(relocatable file).**	"Entry point address:      0x80482b0"*	--Entry point, gives the virtual address to which the system first transfers control, thus*		starting the process.*	*	"Size of this header:               52 (bytes)"*	--gives the size of this elf header.*	*	"Section header string table index: 25 "*	--this is a funy member.It tell us 25th section is a string table which contain of the section headers' name.**/}


void elf::shdr(void)

void elf::shdr(void){//what is section header table?/**	A elf file is consist of many container, called section. In another word, The section is meaning for a container.*	It maybe contain text, data and whatever it needed. when necessary, we will use those to*	building our process demo, just as build a house with some bricks. *	first at all, let me see it structure*/typedef struct {	  Elf32_Word	sh_name;	/* the section's name, a index into the section header string table section. just "shstrtab"*/	  Elf32_Word	sh_type;	  Elf32_Word	sh_flags;		/* attributes,*/	  Elf32_Addr	sh_addr;		/* address of process's memory image*/	  Elf32_Off sh_offset;	/* section's offset in this program file. section postion by bytes*/	  Elf32_Word	sh_size;		/* size of a section*/	  Elf32_Word	sh_link;		/* a index into a section header table section,interpretation depends on the section type. Actually it index into the associated section*/	  Elf32_Word	sh_info;		/* interpretation depends on the section type*/	  Elf32_Word	sh_addralign;	/* some section have address alignment constraint */	  Elf32_Word	sh_entsize; /* some setction be divided to a smaller entry*/} Elf32_Shdr;/**	just as we did above, see this*/[root@localhost blog]# readelf main -SThere are 28 section headers, starting at offset 0x778:Section Headers:  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al  [ 0]                   NULL            00000000 000000 000000 00      0   0  0  [ 1] .interp           PROGBITS        08048114 000114 000013 00   A  0   0  1  [ 2] .note.ABI-tag     NOTE            08048128 000128 000020 00   A  0   0  4  [ 3] .gnu.hash         GNU_HASH        08048148 000148 000020 04   A  4   0  4  [ 4] .dynsym           DYNSYM          08048168 000168 000050 10   A  5   1  4  [ 5] .dynstr           STRTAB          080481b8 0001b8 00004a 00   A  0   0  1  [ 6] .gnu.version      VERSYM          08048202 000202 00000a 02   A  4   0  2  [ 7] .gnu.version_r    VERNEED         0804820c 00020c 000020 00   A  5   1  4  [ 8] .rel.dyn          REL             0804822c 00022c 000008 08   A  4   0  4  [ 9] .rel.plt          REL             08048234 000234 000018 08   A  4  11  4  [10] .init             PROGBITS        0804824c 00024c 000017 00  AX  0   0  4  [11] .plt              PROGBITS        08048264 000264 000040 04  AX  0   0  4  [12] .text             PROGBITS        080482b0 0002b0 0001a8 00  AX  0   0 16  [13] .fini             PROGBITS        08048458 000458 00001c 00  AX  0   0  4  [14] .rodata           PROGBITS        08048474 000474 000012 00   A  0   0  4  [15] .eh_frame         PROGBITS        08048488 000488 000004 00   A  0   0  4  [16] .ctors            PROGBITS        0804948c 00048c 000008 00  WA  0   0  4  [17] .dtors            PROGBITS        08049494 000494 000008 00  WA  0   0  4  [18] .jcr              PROGBITS        0804949c 00049c 000004 00  WA  0   0  4  [19] .dynamic          DYNAMIC         080494a0 0004a0 0000c8 08  WA  5   0  4  [20] .got              PROGBITS        08049568 000568 000004 04  WA  0   0  4  [21] .got.plt          PROGBITS        0804956c 00056c 000018 04  WA  0   0  4  [22] .data             PROGBITS        08049584 000584 000004 00  WA  0   0  4  [23] .bss              NOBITS          08049588 000588 000008 00  WA  0   0  4  [24] .comment          PROGBITS        00000000 000588 000114 00      0   0  1  [25] .shstrtab         STRTAB          00000000 00069c 0000db 00      0   0  1  [26] .symtab           SYMTAB          00000000 000bd8 000440 10     27  48  4  [27] .strtab           STRTAB          00000000 001018 000258 00      0   0  1Key to Flags:  W (write), A (alloc), X (execute), M (merge), S (strings)  I (info), L (link order), G (group), x (unknown)  O (extra OS processing required) o (OS specific), p (processor specific)/**	there are 28 bricks.See some interesting parts:*	"[ 0]                   NULL            00000000 000000 000000 00      0   0  0"*	--this is to section table, just like NULL is to pointer. we use this as a *		NULL section to check invalid index of section table.*	"[ 1] .interp		   PROGBITS 	   08048114 000114 000013 00   A  0   0  1"*	--tell system where to find this file's loader, which help to link shared library *		into process demo. It is normally necessary to those files that use shared *		library.**	"*	[ 4] .dynsym		   DYNSYM		   08048168 000168 000050 10   A  5   1  4*	[ 5] .dynstr		   STRTAB		   080481b8 0001b8 00004a 00   A  0   0  1*	[ 8] .rel.dyn		   REL			   0804822c 00022c 000008 08   A  4   0  4*	[ 9] .rel.plt		   REL			   08048234 000234 000018 08   A  4  11  4*	[11] .plt			   PROGBITS 	   08048264 000264 000040 04  AX  0   0  4*	[20] .got			   PROGBITS 	   08049568 000568 000004 04  WA  0   0  4*	[21] .got.plt		   PROGBITS 	   0804956c 00056c 000018 04  WA  0   0  4*	"*	--about dynamic link, they will tell a very funny story. if possible, I will try to *		explain it in next part.*	"[12] .text			   PROGBITS 	   080482b0 0002b0 0001a8 00  AX  0   0 16"*	--your program, (instruction).**	"[23] .bss              NOBITS          08049588 000588 000008 00  WA  0   0  4"*	--this section holds uninitialized data, and occupies no file space.**	"[24] .comment          PROGBITS        00000000 000588 000114 00      0   0  1"*	--this section holds version control information.see this*/[root@localhost blog]# hexdump main -C  -s 0x588  -n 27600000588  00 47 43 43 3a 20 28 47  4e 55 29 20 34 2e 31 2e  |.GCC: (GNU) 4.1.|00000598  32 20 32 30 30 38 30 37  30 34 20 28 52 65 64 20  |2 20080704 (Red |000005a8  48 61 74 20 34 2e 31 2e  32 2d 34 34 29 00 00 47  |Hat 4.1.2-44)..G|000005b8  43 43 3a 20 28 47 4e 55  29 20 34 2e 31 2e 32 20  |CC: (GNU) 4.1.2 |000005c8  32 30 30 38 30 37 30 34  20 28 52 65 64 20 48 61  |20080704 (Red Ha|000005d8  74 20 34 2e 31 2e 32 2d  34 34 29 00 00 47 43 43  |t 4.1.2-44)..GCC|000005e8  3a 20 28 47 4e 55 29 20  34 2e 31 2e 32 20 32 30  |: (GNU) 4.1.2 20|000005f8  30 38 30 37 30 34 20 28  52 65 64 20 48 61 74 20  |080704 (Red Hat |00000608  34 2e 31 2e 32 2d 34 34  29 00 00 47 43 43 3a 20  |4.1.2-44)..GCC: |00000618  28 47 4e 55 29 20 34 2e  31 2e 32 20 32 30 30 38  |(GNU) 4.1.2 2008|00000628  30 37 30 34 20 28 52 65  64 20 48 61 74 20 34 2e  |0704 (Red Hat 4.|00000638  31 2e 32 2d 34 34 29 00  00 47 43 43 3a 20 28 47  |1.2-44)..GCC: (G|00000648  4e 55 29 20 34 2e 31 2e  32 20 32 30 30 38 30 37  |NU) 4.1.2 200807|00000658  30 34 20 28 52 65 64 20  48 61 74 20 34 2e 31 2e  |04 (Red Hat 4.1.|00000668  32 2d 34 34 29 00 00 47  43 43 3a 20 28 47 4e 55  |2-44)..GCC: (GNU|00000678  29 20 34 2e 31 2e 32 20  32 30 30 38 30 37 30 34  |) 4.1.2 20080704|00000688  20 28 52 65 64 20 48 61  74 20 34 2e 31 2e 32 2d  | (Red Hat 4.1.2-|00000698  34 34 29 00                                       |44).|/*	**	" [25] .shstrtab         STRTAB          00000000 00069c 0000db 00      0   0  1"*	--a string table for section header. */[root@localhost blog]# hexdump main -C  -s 0x69c  -n 2190000069c  00 2e 73 79 6d 74 61 62  00 2e 73 74 72 74 61 62  |..symtab..strtab|000006ac  00 2e 73 68 73 74 72 74  61 62 00 2e 69 6e 74 65  |..shstrtab..inte|000006bc  72 70 00 2e 6e 6f 74 65  2e 41 42 49 2d 74 61 67  |rp..note.ABI-tag|000006cc  00 2e 67 6e 75 2e 68 61  73 68 00 2e 64 79 6e 73  |..gnu.hash..dyns|000006dc  79 6d 00 2e 64 79 6e 73  74 72 00 2e 67 6e 75 2e  |ym..dynstr..gnu.|000006ec  76 65 72 73 69 6f 6e 00  2e 67 6e 75 2e 76 65 72  |version..gnu.ver|000006fc  73 69 6f 6e 5f 72 00 2e  72 65 6c 2e 64 79 6e 00  |sion_r..rel.dyn.|0000070c  2e 72 65 6c 2e 70 6c 74  00 2e 69 6e 69 74 00 2e  |.rel.plt..init..|0000071c  74 65 78 74 00 2e 66 69  6e 69 00 2e 72 6f 64 61  |text..fini..roda|0000072c  74 61 00 2e 65 68 5f 66  72 61 6d 65 00 2e 63 74  |ta..eh_frame..ct|0000073c  6f 72 73 00 2e 64 74 6f  72 73 00 2e 6a 63 72 00  |ors..dtors..jcr.|0000074c  2e 64 79 6e 61 6d 69 63  00 2e 67 6f 74 00 2e 67  |.dynamic..got..g|0000075c  6f 74 2e 70 6c 74 00 2e  64 61 74 61 00 2e 62 73  |ot.plt..data..bs|0000076c  73 00 2e 63 6f 6d 6d 65  6e 74 00                 |s..comment.|00000777/**	"[27] .strtab           STRTAB          00000000 001018 000258 00      0   0  1"*	--a string table for other string.*	--may be see this will useful. From our */[root@localhost blog]# hexdump main -C  -s 0x1018  -n 60000001018  00 63 61 6c 6c 5f 67 6d  6f 6e 5f 73 74 61 72 74  |.call_gmon_start|00001028  00 63 72 74 73 74 75 66  66 2e 63 00 5f 5f 43 54  |.crtstuff.c.__CT|00001038  4f 52 5f 4c 49 53 54 5f  5f 00 5f 5f 44 54 4f 52  |OR_LIST__.__DTOR|00001048  5f 4c 49 53 54 5f 5f 00  5f 5f 4a 43 52 5f 4c 49  |_LIST__.__JCR_LI|00001058  53 54 5f 5f 00 64 74 6f  72 5f 69 64 78 2e 35 37  |ST__.dtor_idx.57|00001068  39 30 00 63 6f 6d 70 6c  65 74 65 64 2e 35 37 38  |90.completed.578|00001078  38 00 5f 5f 64 6f 5f 67  6c 6f 62 61 6c 5f 64 74  |8.__do_global_dt|00001088  6f 72 73 5f 61 75 78 00  66 72 61 6d 65 5f 64 75  |ors_aux.frame_du|00001098  6d 6d 79 00 5f 5f 43 54  4f 52 5f 45 4e 44 5f 5f  |mmy.__CTOR_END__|000010a8  00 5f 5f 46 52 41 4d 45  5f 45 4e 44 5f 5f 00 5f  |.__FRAME_END__._|000010b8  5f 4a 43 52 5f 45 4e 44  5f 5f 00 5f 5f 64 6f 5f  |_JCR_END__.__do_|000010c8  67 6c 6f 62 61 6c 5f 63  74 6f 72 73 5f 61 75 78  |global_ctors_aux|000010d8  00 6d 61 69 6e 2e 63 00  5f 5f 70 72 65 69 6e 69  |.main.c.__preini|000010e8  74 5f 61 72 72 61 79 5f  73 74 61 72 74 00 5f 5f  |t_array_start.__|000010f8  66 69 6e 69 5f 61 72 72  61 79 5f 65 6e 64 00 5f  |fini_array_end._|00001108  47 4c 4f 42 41 4c 5f 4f  46 46 53 45 54 5f 54 41  |GLOBAL_OFFSET_TA|00001118  42 4c 45 5f 00 5f 5f 70  72 65 69 6e 69 74 5f 61  |BLE_.__preinit_a|00001128  72 72 61 79 5f 65 6e 64  00 5f 5f 66 69 6e 69 5f  |rray_end.__fini_|00001138  61 72 72 61 79 5f 73 74  61 72 74 00 5f 5f 69 6e  |array_start.__in|00001148  69 74 5f 61 72 72 61 79  5f 65 6e 64 00 5f 5f 69  |it_array_end.__i|00001158  6e 69 74 5f 61 72 72 61  79 5f 73 74 61 72 74 00  |nit_array_start.|00001168  5f 44 59 4e 41 4d 49 43  00 64 61 74 61 5f 73 74  |_DYNAMIC.data_st|00001178  61 72 74 00 5f 5f 6c 69  62 63 5f 63 73 75 5f 66  |art.__libc_csu_f|00001188  69 6e 69 00 5f 73 74 61  72 74 00 5f 5f 67 6d 6f  |ini._start.__gmo|00001198  6e 5f 73 74 61 72 74 5f  5f 00 5f 4a 76 5f 52 65  |n_start__._Jv_Re|000011a8  67 69 73 74 65 72 43 6c  61 73 73 65 73 00 5f 66  |gisterClasses._f|000011b8  70 5f 68 77 00 5f 66 69  6e 69 00 5f 5f 6c 69 62  |p_hw._fini.__lib|000011c8  63 5f 73 74 61 72 74 5f  6d 61 69 6e 40 40 47 4c  |c_start_main@@GL|000011d8  49 42 43 5f 32 2e 30 00  5f 49 4f 5f 73 74 64 69  |IBC_2.0._IO_stdi|000011e8  6e 5f 75 73 65 64 00 5f  5f 64 61 74 61 5f 73 74  |n_used.__data_st|000011f8  61 72 74 00 5f 5f 64 73  6f 5f 68 61 6e 64 6c 65  |art.__dso_handle|00001208  00 5f 5f 44 54 4f 52 5f  45 4e 44 5f 5f 00 5f 5f  |.__DTOR_END__.__|00001218  6c 69 62 63 5f 63 73 75  5f 69 6e 69 74 00 5f 5f  |libc_csu_init.__|00001228  62 73 73 5f 73 74 61 72  74 00 5f 65 6e 64 00 70  |bss_start._end.p|00001238  75 74 73 40 40 47 4c 49  42 43 5f 32 2e 30 00 5f  |uts@@GLIBC_2.0._|00001248  65 64 61 74 61 00 5f 5f  69 36 38 36 2e 67 65 74  |edata.__i686.get|00001258  5f 70 63 5f 74 68 75 6e  6b 2e 62 78 00 6d 61 69  |_pc_thunk.bx.mai|00001268  6e 00 5f 69 6e 69 74 00                           |n._init.|/***	"[26] .symtab           SYMTAB          00000000 000bd8 000440 10     27  48  4"*	--full name is symbol table, it is just like a identity card for elf file's object.*/}


void elf::phdr(void)

void elf::phdr(void){//next part}


void elf::StringTable(void)

void elf::StringTable(void){//what is a string table? How come we need it?/**	normally, if we want to create a identity card for a people, we maybe need to restore some attributes*	about it. For examples: name, sex, age, and the like. To sex and age, it is easy to assess it's size and *	allocate some space. But for name, we are in trouble, because we couldn't know it's size.*//**	Let me see a trick for deal this problem. if there are three object to store.*		1:  zhang Mr.  , man, 24*		2:  Li Mrs. , woman, 30*		3:  Dr. loooooooooooooooooong, man, 35*	you may be create a struct like this*/	struct IDCard{		char name[ the_longest_name];		int	sex;		int	age;	};/**	That's awful, we will waste many memory space.*	Ok, the second way, you create the following struct:*/	struct IDCard {		char *name_index;		int sex;		int age;	};	struct String {		char[ len1+ len2 + len3]; //all strings are stored  in this.	};/**	this is a funny way. That's the reason why we need a section called by StringTable.*/}


void elf::SymbolTable(void)

void elf::SymbolTable(void){//What is symbol Table ?How come we need it?/**	Image this, there are many functions in a program and they call each other.*	some of them have been used by other function, some of them are waiting *	for use( for example: relocatable file, dynamic link file),How can we describe it?*//**	struct, struct is good for this.we could define object to record its's information.*	Actually , the symbol table is more useful. It not only working for describe some functions,*	but also other object. The follow is its struct:*/typedef struct elf32_sym{	  Elf32_Word	st_name;		/* a index into string table*/	  Elf32_Addr	st_value;		/* point the position of this symbol's define*/	  Elf32_Word	st_size;			  unsigned char st_info;		/* bind(global/local) and type( function, file, ....),*/	  unsigned char st_other;		/* reserved*/	  Elf32_Half	st_shndx;	/* */} Elf32_Sym;/**	see a examples:*/[root@localhost blog]# readelf -s mainSymbol table '.dynsym' contains 5 entries:   Num:    Value  Size Type    Bind   Vis      Ndx Name     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND      1: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__     2: 00000000   415 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.0 (2)     3: 00000000   399 FUNC    GLOBAL DEFAULT  UND puts@GLIBC_2.0 (2)     4: 08048478     4 OBJECT  GLOBAL DEFAULT   14 _IO_stdin_usedSymbol table '.symtab' contains 68 entries:   Num:    Value  Size Type    Bind   Vis      Ndx Name     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND      1: 08048114     0 SECTION LOCAL  DEFAULT    1      2: 08048128     0 SECTION LOCAL  DEFAULT    2      3: 08048148     0 SECTION LOCAL  DEFAULT    3      4: 08048168     0 SECTION LOCAL  DEFAULT    4      5: 080481b8     0 SECTION LOCAL  DEFAULT    5      6: 08048202     0 SECTION LOCAL  DEFAULT    6      7: 0804820c     0 SECTION LOCAL  DEFAULT    7      8: 0804822c     0 SECTION LOCAL  DEFAULT    8      9: 08048234     0 SECTION LOCAL  DEFAULT    9     10: 0804824c     0 SECTION LOCAL  DEFAULT   10     11: 08048264     0 SECTION LOCAL  DEFAULT   11     12: 080482b0     0 SECTION LOCAL  DEFAULT   12     13: 08048458     0 SECTION LOCAL  DEFAULT   13     14: 08048474     0 SECTION LOCAL  DEFAULT   14     15: 08048488     0 SECTION LOCAL  DEFAULT   15     16: 0804948c     0 SECTION LOCAL  DEFAULT   16     17: 08049494     0 SECTION LOCAL  DEFAULT   17     18: 0804949c     0 SECTION LOCAL  DEFAULT   18     19: 080494a0     0 SECTION LOCAL  DEFAULT   19     20: 08049568     0 SECTION LOCAL  DEFAULT   20     21: 0804956c     0 SECTION LOCAL  DEFAULT   21     22: 08049584     0 SECTION LOCAL  DEFAULT   22     23: 08049588     0 SECTION LOCAL  DEFAULT   23     24: 00000000     0 SECTION LOCAL  DEFAULT   24     25: 080482d4     0 FUNC    LOCAL  DEFAULT   12 call_gmon_start    26: 00000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c    27: 0804948c     0 OBJECT  LOCAL  DEFAULT   16 __CTOR_LIST__    28: 08049494     0 OBJECT  LOCAL  DEFAULT   17 __DTOR_LIST__    29: 0804949c     0 OBJECT  LOCAL  DEFAULT   18 __JCR_LIST__    30: 08049588     4 OBJECT  LOCAL  DEFAULT   23 dtor_idx.5790    31: 0804958c     1 OBJECT  LOCAL  DEFAULT   23 completed.5788    32: 08048300     0 FUNC    LOCAL  DEFAULT   12 __do_global_dtors_aux    33: 08048360     0 FUNC    LOCAL  DEFAULT   12 frame_dummy    34: 00000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c    35: 08049490     0 OBJECT  LOCAL  DEFAULT   16 __CTOR_END__    36: 08048488     0 OBJECT  LOCAL  DEFAULT   15 __FRAME_END__    37: 0804949c     0 OBJECT  LOCAL  DEFAULT   18 __JCR_END__    38: 08048430     0 FUNC    LOCAL  DEFAULT   12 __do_global_ctors_aux    39: 00000000     0 FILE    LOCAL  DEFAULT  ABS main.c    40: 0804948c     0 NOTYPE  LOCAL  HIDDEN   16 __preinit_array_start    41: 0804948c     0 NOTYPE  LOCAL  HIDDEN   16 __fini_array_end    42: 0804956c     0 OBJECT  LOCAL  HIDDEN   21 _GLOBAL_OFFSET_TABLE_    43: 0804948c     0 NOTYPE  LOCAL  HIDDEN   16 __preinit_array_end    44: 0804948c     0 NOTYPE  LOCAL  HIDDEN   16 __fini_array_start    45: 0804948c     0 NOTYPE  LOCAL  HIDDEN   16 __init_array_end    46: 0804948c     0 NOTYPE  LOCAL  HIDDEN   16 __init_array_start    47: 080494a0     0 OBJECT  LOCAL  HIDDEN   19 _DYNAMIC    48: 08049584     0 NOTYPE  WEAK   DEFAULT   22 data_start    49: 080483b0     5 FUNC    GLOBAL DEFAULT   12 __libc_csu_fini    50: 080482b0     0 FUNC    GLOBAL DEFAULT   12 _start    51: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__    52: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses    53: 08048474     4 OBJECT  GLOBAL DEFAULT   14 _fp_hw    54: 08048458     0 FUNC    GLOBAL DEFAULT   13 _fini    55: 00000000   415 FUNC    GLOBAL DEFAULT  UND __libc_start_main@@GLIBC_    56: 08048478     4 OBJECT  GLOBAL DEFAULT   14 _IO_stdin_used    57: 08049584     0 NOTYPE  GLOBAL DEFAULT   22 __data_start    58: 0804847c     0 OBJECT  GLOBAL HIDDEN   14 __dso_handle    59: 08049498     0 OBJECT  GLOBAL HIDDEN   17 __DTOR_END__    60: 080483c0   105 FUNC    GLOBAL DEFAULT   12 __libc_csu_init    61: 08049588     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start    62: 08049590     0 NOTYPE  GLOBAL DEFAULT  ABS _end    63: 00000000   399 FUNC    GLOBAL DEFAULT  UND puts@@GLIBC_2.0    64: 08049588     0 NOTYPE  GLOBAL DEFAULT  ABS _edata    65: 08048429     0 FUNC    GLOBAL HIDDEN   12 __i686.get_pc_thunk.bx    66: 08048384    43 FUNC    GLOBAL DEFAULT   12 main    67: 0804824c     0 FUNC    GLOBAL DEFAULT   10 _init}

 

void elf::Relocation(void)

void elf::Relocation(void){//next part}