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
");
	return 0;
}
/*
*	compile it,and check it
*/
[root@localhost blog]# gcc main.c -o main
[root@localhost blog]# readelf -h main
ELF 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 -S There 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 1 Key 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 276 00000588 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 219 0000069c 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 600 00001018 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 main

Symbol 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_used

Symbol 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
}
原文地址:https://www.cnblogs.com/llguanli/p/6794532.html