2015-08-12 15 views
9

Ben GCC 4.8 ile bir uygulama derlenmiş ve ben sözde desteği eklendi GDB 7.5+ (yok eski sistemde hata ayıklamak çalışıyorum DWARF-4). GDB'nin bu sisteme yükseltilmesi bir seçenek değildir.GCC 4.8 ekler bile bir derleme birimi başlığında sürüm 4 -gdwarf-2

Dwarf Error: wrong version in compilation unit header (is 4, should be 2) [in module a.out] 

ben diğer sorular önerildiği ancak derleyici sürümü ile derleme birimi başlıklarının bir çift ekleme tutar olarak -gdwarf-2 -gstrict-cüce ile derleme çalıştı: GDB aşağıdaki mesajı verir çünkü bunu debug olamaz 4:

/home/MuchToLearn/src> cat main.c 
int main(void) 
{ 
    return 0; 
} 
/home/MuchToLearn/src> gcc -gdwarf-2 -gstrict-dwarf main.c 

burada bir şey eksik: aşağıdaki gibi minimal bir C programı derlemek eğer

/tmp> readelf --debug-dump=info a.out | grep -A2 'Compilation Unit @' 
readelf: Warning: CU at offset 6b contains corrupt or unsupported version number: 4. 
readelf: Warning: CU at offset 1eb contains corrupt or unsupported version number: 4. 
    Compilation Unit @ offset 0x0: 
    Length:  0x67 (32-bit) 
    Version:  2 
-- 
    Compilation Unit @ offset 0x6b: 
    Length:  0x84 (32-bit) 
    Version:  4 
-- 
    Compilation Unit @ offset 0xf3: 
    Length:  0x62 (32-bit) 
    Version:  2 
-- 
    Compilation Unit @ offset 0x159: 
    Length:  0x8e (32-bit) 
    Version:  2 
-- 
    Compilation Unit @ offset 0x1eb: 
    Length:  0x136 (32-bit) 
    Version:  4 
-- 
    Compilation Unit @ offset 0x325: 
    Length:  0x62 (32-bit) 
    Version:  2 

bile gerçekleşir? Sadece DWARF-2'yi destekleyen eski GDB sürümleri tarafından ayıklanabilen ikili dosyalar oluşturmayacaksa, -gdwarf-2 seçeneğinin kullanılmasının amacı nedir?

Düzenleme: istihdam Rus'un yanıt doğrudur. Sürüm-4 derleme birimleri /usr/lib/crt1.o ve /usr/lib/libc_nonshared.a'dan geliyordu. Sorunu düzeltmek için onları yerel bir dizine kopyalayıp hata ayıklama sembollerini strip -g ile kaldırdım.

ld -o main -dynamic-linker /lib/ld-linux.so.2 crt1.o /usr/lib/crti.o main.o /lib/libc.so.6 libc_nonshared.a /usr/lib/crtn.o 

elde edilen yürütülebilir herhangi bir sürüm-4 derleme birimlerini ihtiva etmez ve GDB bu şikayet durduruldu aşağıdaki gibidir: Daha sonra, I yürütülebilir bağlı.

+0

Muhtemelen daha yeni bir cüce sürümü ile derlenmiş kütüphaneleri kullanıyor musunuz? Statik olarak bir şey bağlamadığınız sürece sadece bir 'Derleme Birimi' cümleciğine sahip olmalısınız ... – o11c

+0

Glibc gibi gizli bir şey olmadığı sürece, fikirlerim tükendi. Bu, printf() 'işlevini bile kullanmayan sorudaki minimal programla bile oldu. – MuchToLearn

cevap

4

Bu aşağıdaki gibi minimal bir C programı derlemek bile gerçekleşir:

Hatta bu asgari programı statik (yani crt1.o, crtbegin.o vs.) libc'nin parçaları bağlanır.

Sen versiyon 4 var derleme birimleri gerçekten bir kütüphaneden programınıza gelen ve olmadığını doğrulamak gerekir (sadece onların DW_AT_name ve DW_AT_comp_dir bakmak).

Benim gcc-4.8: Ben bunu sorduğunuzda gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4 sürüm 2 üretir: sürüm 4 nesneler gerçekten sadece crt1.o veya benzer ise, güvenle bu nesneler üzerinde strip -g çalıştırabilirsiniz unutmayın

gcc -g -c t.c 
readelf -wi t.o | grep -A2 'Compilation Unit' 
    Compilation Unit @ offset 0x0: 
    Length:  0x4e (32-bit) 
    Version:  4 

gcc -gdwarf-2 -c t.c 
readelf -wi t.o | grep -A2 'Compilation Unit' 
    Compilation Unit @ offset 0x0: 
    Length:  0x52 (32-bit) 
    Version:  2 

- Çok fazla kaybetmeyeceksiniz (libc başlangıç ​​sorunlarını ayıklamak zorunda olmadığınız sürece).

İlgili konular