2016-04-13 27 views
0

Solaris Studio 12 üzerinde Solaris Studio 12.x kullanarak basit bir merhaba dünyası programı oluşturmaya çalışıyorum. Eğer aynı dosyayı iki farklı klasörden derlediğimde, diff komutu veya cmp komutu ile gösterildiği gibi nesne dosyası.Solaris Studio nesne dosyasında geçerli dizin bilgisi ekleniyor

Her iki nesne dosyasının (od -x) bir hex dökümünü aldı ve bunları karşılaştırdı ve hex'i ASCII'ye dönüştürebilecek çevrimiçi bir araç kullanarak, nesne dosyaları derlemenin geçerli dizini içerdiği için farkın meydana geldiğini fark etti. Başlatıldı.

Soru, derleyiciye, geçerli dizindeki bilgileri nesne dosyalarına dahil etmemesi gerektiğini anlatır. Birkaç optimizasyon seçeneği denendi - bunu çözmek için kullanışlı değildi.

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

cevap

2

derleyici debugger'lar için yararlıdır bilgilerini yerleştirerek edilir: Burada

kullandığım kodları ve komutlardır. Bu bilgi varsayılan olarak dwarf biçimindedir.

İkili dosyalar için bu bilgileri ayıklamak için dwarfdump komutunu kullanabilirsiniz.

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

ikili sıyrılması (strip a.out): Her bir dosya için oluşturulan çıktı karşılaştırırsanız, orijinal ikili derlendi dizin örneğin cüce başlığındaki yerin birkaç depolandığını göreceksiniz Bu üstbilgiyi kaldırmalı ve her iki derlenmiş dosyayı da aynı yapmalıdır.

Derleyicinin eski bir sürümünü kullanıyor veya -xdebugformat=stabs derleyici seçeneğini kullanmanız gerekiyorsa, hata ayıklama bilgisi cüce yerine stabs biçiminde depolanmış olurdu. Böyle bir durumda, komut o dumpstabs olduğunu ayıklamak ve derleme dizinine ilişkin benzer farklılıklar, bulur örn: Bu konuda var

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

Bir bilgi -zstrip-class = ayıklama seçeneğini kullanmaktır hangi Bu yol bilgisi nesne dosyasından kaldırır. Bu seçeneği kullandıktan sonra, iki farklı klasörden oluşturulan iki nesne dosyası arasında fark olmadığını kontrol ettik. Ancak, bu sayfa (https://docs.oracle.com/cd/E26502_01/html/E29030/ld-1.html) gösterildiği gibi, bu seçenek, nesne dosyasından hata ayıklama bilgisi ile ilgili bölümleri kaldırır. Sadece yol bilgisini kaldıran ve gerektiğinde diğer hata ayıklama bilgilerini saklayan daha basit bir seçenek yok gibi görünüyor.