[英]objdump gives the same output for object files generated with and without -fPIC
我有兩個文件ah和a.cpp:
// a.h
extern "C" void a();
// a.cpp
#include "a.h"
#include <stdio.h>
void a()
{
printf("a\n");
}
我在使用-fPIC
和不-fPIC
情況下都對此進行了編譯,然后兩者都進行了objdump
。 奇怪的是,兩個文件的輸出都相同。 對於a()
,在兩種情況下我都可以得到:
callq 15 <a+0x15>
我還嘗試使用-no-pie
編譯目標文件,但還是沒有運氣。
默認情況下, objdump
不執行重定位處理。 請嘗試objdump --reloc
。
在您的情況下,編譯器和匯編器會產生R_X86_64_PLT32
重定位。 這是與位置無關的重定位。 看來您的編譯器默認會生成PIE二進制文件。 -no-pie
是鏈接器標記,您需要使用-fno-pie
更改編譯器輸出。 (在這種情況下,這沒關系,因為在鏈接編輯器運行之后,最終結果將是相同的。)
以詳細模式( -v
)編譯代碼(或其他任何代碼),檢查輸出,您將發現:
Configured with: ... --enable-default-pie ...
從GCC 6開始,這意味着該工具鏈是為編譯PIC代碼和默認情況下鏈接PIE可執行文件而構建的。
要堅持使用非PIC編譯,請運行例如
g++ -Wall -c -fno-PIC -o anopic.o a.cpp
並堅持PIC編譯,運行例如
g++ -Wall -c -fPIC -o apic.o a.cpp
然后運行:
$ objdump -d anopic.o
anopic.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <a>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: bf 00 00 00 00 mov $0x0,%edi
9: e8 00 00 00 00 callq e <a+0xe>
e: 90 nop
f: 5d pop %rbp
10: c3 retq
和:
$ objdump -d apic.o
apic.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <a>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # b <a+0xb>
b: e8 00 00 00 00 callq 10 <a+0x10>
10: 90 nop
11: 5d pop %rbp
12: c3 retq
您會發現其中的區別。
您可以通過以下方式將重定位與程序集交織:
$ objdump --reloc -d anopic.o
anopic.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <a>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: bf 00 00 00 00 mov $0x0,%edi
5: R_X86_64_32 .rodata
9: e8 00 00 00 00 callq e <a+0xe>
a: R_X86_64_PC32 puts-0x4
e: 90 nop
f: 5d pop %rbp
10: c3 retq
和:
$ objdump --reloc -d apic.o
apic.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <a>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # b <a+0xb>
7: R_X86_64_PC32 .rodata-0x4
b: e8 00 00 00 00 callq 10 <a+0x10>
c: R_X86_64_PLT32 puts-0x4
10: 90 nop
11: 5d pop %rbp
12: c3 retq
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.