簡體   English   中英

objdump為使用-fPIC和不使用-fPIC生成的目標文件提供相同的輸出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM