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 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
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值