2016-04-13 65 views
0

我正嘗試在Solaris 11上使用Solaris Studio 12.x構建一個簡單的Hello World程序。如果我從兩個不同的文件夾編譯相同的文件,目標文件,如diff命令或cmp命令所示。Solaris Studio在目標文件中添加當前目錄信息

對這兩個目標文件(od -x)進行了十六進制轉儲,並對它們進行了比較,並使用可將十六進制轉換爲ASCII的在線工具,發現差別正在發生,因爲目標文件包含當前編譯目錄被啓動。

問題是如何告訴編譯器不要在目標文件中包含當前目錄的信息。嘗試了幾個優化選項 - 沒有用於解決這個問題。

這裏是我使用的代碼和命令:

bash-4.1$ cat a.cpp 
#include <stdio.h> 

int main() { 
    printf("Hello World!"); 
    return 0; 

} 
bash-4.1$ ls 
a.cpp temp1 temp2 
bash-4.1$ cd temp1 
bash-4.1$ /opt/SunProd/studio12u3/solarisstudio12.3//bin/CC ../a.cpp 
bash-4.1$ cd ../temp2 
bash-4.1$ /opt/SunProd/studio12u3/solarisstudio12.3//bin/CC ../a.cpp 
bash-4.1$ cd .. 
bash-4.1$ diff temp1/a.out temp2/a.out 
Binary files temp1/a.out and temp2/a.out differ 
bash-4.1$ cmp temp1/a.out temp2/a.out 
temp1/a.out temp2/a.out differ: char 5968, line 24 
bash-4.1$ od -x temp1/a.out > temp1/a.hex 
bash-4.1$ od -x temp2/a.out > temp2/a.hex 
bash-4.1$ diff -c temp1/a.hex temp2/a.hex 
... shows hex diff (two sets) ... 

回答

2

編譯器嵌入作爲用於調試器有用的信息。此信息默認爲dwarf格式。

您可以使用dwarfdump命令爲二進制文件提取此信息。如果你比較每個文件生成的輸出,你會發現這裏原來的二進制編譯目錄存儲在幾個位置的侏儒頭,如:

# diff */*.dwarf 
9c9 
<      DW_AT_comp_dir    "/tmp/temp1/" 
--- 
>      DW_AT_comp_dir    "/tmp/temp2/" 
29c29 
< 2: N_CMDLINE 0x0,0x0,0x0 "/tmp/temp1/; /opt/solarisstudio12.4/bin/CC ../a.c" 
--- 
> 2: N_CMDLINE 0x0,0x0,0x0 "/tmp/temp2/; /opt/solarisstudio12.4/bin/CC ../a.c" 

剝離二進制(strip a.out)應刪除該標題並使兩個編譯的文件完全相同。

如果您使用舊版本的編譯器或使用-xdebugformat=stabs編譯器選項,調試信息將以stabs格式而不是矮字存儲。在這種情況下,命令解壓它是dumpstabs並會找到相關的彙編目錄類似的差異,如:我對這個有

.stabs "/tmp/temp1/; /opt/solarisstudio12.4/bin/CC -xdebugformat=stabs ../a.c",N_CMDLINE,0x0,0x0,0x0 
0

一個信息是使用-zstrip級=調試選項,從目標文件中刪除此路徑信息。檢查使用此選項後,從兩個不同文件夾創建的兩個對象文件之間沒有區別。 但是,正如該頁面(https://docs.oracle.com/cd/E26502_01/html/E29030/ld-1.html)所示,此選項從目標文件中刪除與調試信息相關的部分。 似乎沒有更簡單的選項,只需要刪除路徑信息並保留其他調試信息。

相關問題