2016-04-13 6 views
0

Ich versuche, ein einfaches Hello World-Programm mit Solaris Studio 12.x unter Solaris 11 zu erstellen. Wenn ich die gleiche Datei aus zwei verschiedenen Ordnern kompiliere, bekomme ich einen Unterschied in der Objektdatei, wie durch den Befehl diff oder cmp angezeigt.Solaris Studio Hinzufügen von aktuellen Verzeichnisinformationen in Objektdatei

Wurde ein Hex-Dump von beiden Objektdateien (od -x) genommen und verglichen und mit einem Online-Tool, das Hex in ASCII konvertieren kann, festgestellt, dass der Unterschied auftritt, da die Objektdateien das aktuelle Verzeichnis enthalten, aus dem die Kompilierung wurde initiiert.

Die Frage ist, wie man den Compiler anweist, die Informationen über das aktuelle Verzeichnis in den Objektdateien nicht zu berücksichtigen. Habe einige Optimierungsoptionen versucht - war nicht nützlich, um dies zu beheben.

Hier sind die Codes und Befehle, die ich verwendet:

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) ... 

Antwort

2

Der Compiler Informationen ist die Einbettung, die für Debugger nützlich ist. Diese Information ist standardmäßig im Format dwarf.

Sie können den Befehl dwarfdump verwenden, um diese Informationen für die Binärdateien zu extrahieren. Wenn Sie die Ausgabe erzeugt für jede Datei zu vergleichen, werden Sie sehen, dass das Verzeichnis, in dem die ursprünglichen binären kompiliert wurde in ein paar Lage im Zwerg-Header gespeichert wird, zB:

# 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" 

Strippen des binären (strip a.out) sollte diesen Header entfernen und beide kompilierten Dateien identisch machen. Wenn Sie eine ältere Version des Compilers verwenden oder die Compileroption -xdebugformat=stabs verwenden, wäre die Debugging-Information im Format stabs anstelle von Zwerg gespeichert worden. In einem solchen Fall extrahieren der Befehl es dumpstabs und würde ähnliche Unterschiede in Bezug auf die Zusammenstellung Verzeichnis, zB finden:

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

Eine Information, die ich auf diese bekam ist -zstrip-class = Debug-Option zu verwenden, die Entfernt diese Pfadinfo aus der Objektdatei. Überprüft, dass nach der Verwendung dieser Option kein Unterschied zwischen den zwei Objektdateien besteht, die aus zwei verschiedenen Ordnern erstellt wurden. Wie diese Seite (https://docs.oracle.com/cd/E26502_01/html/E29030/ld-1.html) jedoch zeigt, entfernt diese Option Abschnitte, die sich auf Debuginformationen aus der Objektdatei beziehen. Es scheint, dass es keine einfachere Option gibt, die nur die Pfadinformationen entfernt und andere Debug-Informationen bei Bedarf speichert.