2016-04-13 12 views
0

Solaris 11でSolaris Studio 12.xを使用して簡単なhello worldプログラムを作成しようとしています。別の2つのフォルダから同じファイルをコンパイルすると、 diffコマンドまたはcmpコマンドで示されるようなオブジェクトファイル。Solaris Studioでオブジェクトファイルに現在のディレクトリ情報を追加

両方のオブジェクトファイル(od -x)を16進数でダンプし、それらを比較し、16進数を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コンパイラオプションを使用すると、デバッグ情報がdwarfの代わりにstabs形式で格納されます。そのような場合には、それを抽出するコマンドはdumpstabsで、コンパイル・ディレクトリーに関連する同様の違い、例えば見つけるだろう:私はこれに乗った情報は-zstripクラス=デバッグオプションを使用することです

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

一つを、どのオブジェクトファイルからこのパス情報を削除します。このオプションを使用した後、2つの異なるフォルダから作成された2つのオブジェクトファイルに違いはないことを確認しました。 ただし、このページ(https://docs.oracle.com/cd/E26502_01/html/E29030/ld-1.html)に示すように、デバッグ情報に関連するセクションをオブジェクトファイルから削除します。 パス情報だけを削除し、必要に応じて他のデバッグ情報を保持する単純なオプションはないようです。