首頁>Program>source

有一種方法可以查看在* nix中使用了哪些編譯器和標志来建立可執行檔案? 我已经編譯了一个旧版本的代碼,我想看看它是经過優化的還是未经優化的. Google並没有太大帮助,但是我不確定我使用的關鍵字是否正確。

最新回復
  • 3月前
    1 #

    gcc有一个 -frecord-gcc-switches 選項:

      -frecord-gcc-switches
           This switch causes the command line that was used to invoke the compiler to
           be recorded into the object file that is being created.  This switch is only
           implemented on some targets and the exact format of the recording is target
           and binary file format dependent, but it usually takes the form of a section
           containing ASCII text.
    

    然後,ELF可執行檔案將包含 .GCC.command.line 帶有该資訊的部分。

    $ gcc -O2 -frecord-gcc-switches a.c
    $ readelf -p .GCC.command.line a.out 
    String dump of section '.GCC.command.line':
      [     0]  a.c
      [     4]  -mtune=generic
      [    13]  -march=x86-64
      [    21]  -O2
      [    25]  -frecord-gcc-switches
    

    当然,如果没有该選項,編譯的可執行檔案將無法使用。


    對於簡單的優化情况,如果檔案是使用除錯資訊編譯的,則可以尝試使用除錯器.如果稍稍进行,可能会註意到某些變數已被"優化".這表明已经进行了優化。

  • 3月前
    2 #

    如果使用 -frecord-gcc-switches进行編譯 標記,則命令列編譯器選項將以二进製形式寫入註釋部分.另請參阅文件。

  • 3月前
    3 #

    另一个選項是-grecord-gcc-swtiches(註意,不是-f而是-g).根据gcc docs的介绍,它將標記放入矮小的除錯資訊中.从gcc 4.8開始,它似乎是預設啟用的。

    我發現dwarfdump程式對於提取那些cflag是有用的.註意,字元串程式看不到它们.似乎矮資訊已壓縮。

  • 3月前
    4 #

    這需要編譯器支援.您没有提到正在使用什麼編譯器,但是由於您標記了問题 linux 我將假設您使用的是gcc -不会預設您要查詢的功能(但是-frecord-gcc-switches是執行此操作的選項)。

    如果您想檢查二进製檔案,請 strings 该命令將向您顯示檔案中似乎是可讀字元串的所有內容。

  • 3月前
    5 #

    我非常怀疑是否有可能:

    int main()
    {
    }
    

    使用以下命令編譯時:

    gcc -O3 -ffast-math -g main.c -o main
    

    在生成的物件中找不到任何引數:

    strings main | grep -O3
    (no output)
    

  • deployment:Android Studio未將更改部署到應用程式
  • xml:您如何在全域性範圍內將Jackson設置為忽略Spring中的未知屬性?