对PIC(position independent code)的探究
来源:互联网 发布:淘宝几百块发省级期刊 编辑:程序博客网 时间:2024/05/16 07:29
示例:
static int a=2;extern int b;extern void test();int glo=2;void bar(){ a=1; b=2; glo=3;}void foo(){ bar(); test();}
在这个例子中 ,有局部变量a 外部全局变量b 本地全局变量glo 本地全局函数bar() 外部全局函数test()
编译:
gcc -m32 -fPIC -c test.c -o test.o
汇编代码 objdump -d test.o
:
Disassembly of section .text:00000000 <bar>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: e8 fc ff ff ff call 4 <bar+0x4> 8: 05 01 00 00 00 add $0x1,%eax d: c7 80 00 00 00 00 01 movl $0x1,0x0(%eax) 14: 00 00 00 17: 8b 90 00 00 00 00 mov 0x0(%eax),%edx 1d: c7 02 02 00 00 00 movl $0x2,(%edx) 23: 8b 80 00 00 00 00 mov 0x0(%eax),%eax 29: c7 00 03 00 00 00 movl $0x3,(%eax) 2f: 90 nop 30: 5d pop %ebp 31: c3 ret 00000032 <foo>: 32: 55 push %ebp 33: 89 e5 mov %esp,%ebp 35: 53 push %ebx 36: 83 ec 04 sub $0x4,%esp 39: e8 fc ff ff ff call 3a <foo+0x8> 3e: 81 c3 02 00 00 00 add $0x2,%ebx 44: e8 fc ff ff ff call 45 <foo+0x13> 49: e8 fc ff ff ff call 4a <foo+0x18> 4e: 90 nop 4f: 83 c4 04 add $0x4,%esp 52: 5b pop %ebx 53: 5d pop %ebp 54: c3 ret Disassembly of section .text.__x86.get_pc_thunk.ax:00000000 <__x86.get_pc_thunk.ax>: 0: 8b 04 24 mov (%esp),%eax 3: c3 ret Disassembly of section .text.__x86.get_pc_thunk.bx:00000000 <__x86.get_pc_thunk.bx>: 0: 8b 1c 24 mov (%esp),%ebx 3: c3 ret
elf信息: readelf -a test.o
ELF 头: 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: REL (可重定位文件) Machine: Intel 80386 Version: 0x1 入口点地址: 0x0 程序头起点: 0 (bytes into file) Start of section headers: 1044 (bytes into file) 标志: 0x0 本头的大小: 52 (字节) 程序头大小: 0 (字节) Number of program headers: 0 节头大小: 40 (字节) 节头数量: 16 字符串表索引节头: 13节头: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .group GROUP 00000000 000034 000008 04 14 15 4 [ 2] .group GROUP 00000000 00003c 000008 04 14 19 4 [ 3] .text PROGBITS 00000000 000044 000055 00 AX 0 0 1 [ 4] .rel.text REL 00000000 0003ac 000048 08 I 14 3 4 [ 5] .data PROGBITS 00000000 00009c 000008 00 WA 0 0 4 [ 6] .bss NOBITS 00000000 0000a4 000000 00 WA 0 0 1 [ 7] .text.__x86.get_p PROGBITS 00000000 0000a4 000004 00 AXG 0 0 1 [ 8] .text.__x86.get_p PROGBITS 00000000 0000a8 000004 00 AXG 0 0 1 [ 9] .comment PROGBITS 00000000 0000ac 00002e 01 MS 0 0 1 [10] .note.GNU-stack PROGBITS 00000000 0000da 000000 00 0 0 1 [11] .eh_frame PROGBITS 00000000 0000dc 000084 00 A 0 0 4 [12] .rel.eh_frame REL 00000000 0003f4 000020 08 I 14 11 4 [13] .shstrtab STRTAB 00000000 000160 000096 00 0 0 1 [14] .symtab SYMTAB 00000000 0001f8 000150 10 15 13 4 [15] .strtab STRTAB 00000000 000348 000062 00 0 0 1Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings) I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific)COMDAT group section [ 1] `.group' [__x86.get_pc_thunk.ax] contains 1 sections: [Index] Name [ 7] .text.__x86.get_pc_thunk.axCOMDAT group section [ 2] `.group' [__x86.get_pc_thunk.bx] contains 1 sections: [Index] Name [ 8] .text.__x86.get_pc_thunk.bx本文件中没有程序头。重定位节 '.rel.text' 位于偏移量 0x3ac 含有 9 个条目: Offset Info Type Sym.Value Sym. Name00000004 00000f02 R_386_PC32 00000000 __x86.get_pc_thunk.ax00000009 0000100a R_386_GOTPC 00000000 _GLOBAL_OFFSET_TABLE_0000000f 00000309 R_386_GOTOFF 00000000 .data00000019 00001103 R_386_GOT32 00000000 b00000025 00000d03 R_386_GOT32 00000004 glo0000003a 00001302 R_386_PC32 00000000 __x86.get_pc_thunk.bx00000040 0000100a R_386_GOTPC 00000000 _GLOBAL_OFFSET_TABLE_00000045 00000e04 R_386_PLT32 00000000 bar0000004a 00001404 R_386_PLT32 00000000 test重定位节 '.rel.eh_frame' 位于偏移量 0x3f4 含有 4 个条目: Offset Info Type Sym.Value Sym. Name00000020 00000202 R_386_PC32 00000000 .text00000040 00000202 R_386_PC32 00000000 .text00000064 00000602 R_386_PC32 00000000 .text.__x86.get_pc_thu00000078 00000702 R_386_PC32 00000000 .text.__x86.get_pc_thuThe decoding of unwind sections for machine type Intel 80386 is not currently supported.Symbol table '.symtab' contains 21 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 FILE LOCAL DEFAULT ABS testpic.c 2: 00000000 0 SECTION LOCAL DEFAULT 3 3: 00000000 0 SECTION LOCAL DEFAULT 5 4: 00000000 0 SECTION LOCAL DEFAULT 6 5: 00000000 4 OBJECT LOCAL DEFAULT 5 a 6: 00000000 0 SECTION LOCAL DEFAULT 7 7: 00000000 0 SECTION LOCAL DEFAULT 8 8: 00000000 0 SECTION LOCAL DEFAULT 10 9: 00000000 0 SECTION LOCAL DEFAULT 11 10: 00000000 0 SECTION LOCAL DEFAULT 9 11: 00000000 0 SECTION LOCAL DEFAULT 1 12: 00000000 0 SECTION LOCAL DEFAULT 2 13: 00000004 4 OBJECT GLOBAL DEFAULT 5 glo 14: 00000000 50 FUNC GLOBAL DEFAULT 3 bar 15: 00000000 0 FUNC GLOBAL HIDDEN 7 __x86.get_pc_thunk.ax 16: 00000000 0 NOTYPE GLOBAL DEFAULT UND _GLOBAL_OFFSET_TABLE_ 17: 00000000 0 NOTYPE GLOBAL DEFAULT UND b 18: 00000032 35 FUNC GLOBAL DEFAULT 3 foo 19: 00000000 0 FUNC GLOBAL HIDDEN 8 __x86.get_pc_thunk.bx 20: 00000000 0 NOTYPE GLOBAL DEFAULT UND testNo version information found in this file.
R_386_PC32
符号地址+重定位处值-重定位地址 R_386_GOTPC
got.plt地址(GOT)+重定位处值-重定位地址 用于确定 R_386_GOTOFF
符号地址-GOT 局部变量位于.data中利用相对GOT的值修改局部变量值 用于全局静态变量 R_386_GOT32
符号地址(在.got中) 全局变量在.got中的偏移 全局变量 R_386_PLT32
函数在.plt地址(bar@plt)+重定位处值-重定位地址 函数
0 0
- 对PIC(position independent code)的探究
- Position Independent Code (PIC) in shared libraries
- Position Independent Code (PIC) in shared libraries
- Position Independent Code (PIC) in shared libraries
- Position Independent Code (PIC) in shared libraries on x64
- Position Independent Code (PIC) in shared libraries on x64
- only position independent executables (PIE) are supported的解决问题
- 对position的理解
- 对死锁的探究
- 对死锁的探究
- html——float与position的兼容性探究
- Maray中对8259A PIC的初始化代码
- Maray中对8259A PIC的初始化代码
- Writing Endian Independent Code in C++
- Writing endian-independent code in C
- error: only position independent executables (PIE) are supported.
- error: only position independent executables (PIE) are supported.
- error: only position independent executables (PIE) are supported
- 快速排序
- 42.打造安全的App!iOS安全系列之 HTTPS
- Codeforces Round #228 (Div. 1) A. Fox and Box Accumulation
- leetcode:Move Zeroes 【Java】
- fork函数02
- 对PIC(position independent code)的探究
- atitit.userService 用户系统设计 v4 q316 .doc
- HDU 4704 Sum 费马小定理
- 单向链表的倒置
- Linux笔记(56)——获取操作系统基本信息
- CLR线程池
- Atitit.复合文档的格式 标准化格式
- 认识Elasticsearch
- Java生成多个随机长度字符串并用Collections排序