2014-06-10 16 views
5

Uzun bir hata ayıklama dizisinden sonra, sorunumu bir dosyaya daralttım. Sorun şu ki, dosya, her şey aynı olduğunda, iki farklı dizinde farklı şekilde derleniyor.Aynı kaynak kodun derlenmesi farklı nesne dosyaları nasıl oluşturabilir?

Ben CodeSourcery kolu gcc derleyici kullanıyorum (gcc version 4.3.3, Sourcery G ++ Lite 2009q1-161) basit dosyasını derlemek için. Sorunları olmayan bir modülde kullanıyordum ve sonra onu kullanmak için başka bir modüle kopyaladım. Derleme olduğunda, nesne dosyası önemli ölçüde farklıdır. Iki dosyayı derlemek için komut satırı aynıdır (emin olmak için linux geçmişini kullandım) ve 3 dahil dosyalar aynı kopyalardır (diff ile kontrol edilir).

bir ikili iki nesne dosyaları üzerinde karşılaştırma yaptı ve onlar etrafında dağınık bireysel bayt farklılıkların çok şey var. Her ikisinin de bir itirazı yaptım ve onları karşılaştırdım ve çok farklılıklar var. İşte dump1, dump2 ve diff. Komut satırı " kol-none-eabi-gcc -std = gnu99 -Wall -O3 -g3 -ggdb -Wextra -Wno-kullanılmayan -c crc.c -o crc.o" dir.

Bu nasıl olabilir? -c yerine -S ile derledim ve assembler çıktısına baktım ve dizin yolu haricinde aynıydı. Peki, nesne dosyası nasıl farklı olabilir?

Benim asıl sorun benim programa Dump2 nesne dosyasını bağlamaya çalışırken, ben tanımsız başvuru hataları almak, yani Dump1 nesne böyle hataları alıyor ve ince bağlar oysa nesnede şey yanlıştır.

+0

Görünüşe göre bunun için bir etiket [tag: binary-reproducibility] var. Bu derleyiciyle aynı şeyi gördüm. * Diff * 'nin çoğunluğu farklı kayıt seçimi veya dosya ofsetlerini gösterir, ancak aynı temel işlevselliğe sahiptir. Bakınız: [Debian yeniden üretilebilir yapılar] (https://wiki.debian.org/ReproducibleBuilds). Tabii ki çıktı farklıdır. Bu senin problemin mi? Sorununuzun başka bir şey olduğunu düşünüyorum. –

+0

Ayrıca: [Her yapı içinde SO ikili değişen] (http://stackoverflow.com/questions/4140329/binary-object-file-changing-in-each-build), vb O0 'ile derleme deneyebilirsiniz –

+0

farklılıkların devam edip etmediğini görmek için. – markgz

cevap

0

Dosya büyük olasılıkla farklı dosyalar içerir. Bu en olası sebep. senin yollarını içer

Kontrol, tam olarak dahil tablolara yolları aynıdır. Farklı dizinlere işaret edebilirler. C ve C++, #include abcd.h, arama dosyasının dizininden abcd.h yüklemeye çalıştığında bir özelliğe sahiptir. Şuna göz at.

1

büyük ölçekli yazılım, birçok uygulamalar işaretçileri karma yapıyoruz vardır. Bu, sonuç randomizasyonuna neden olan önemli bir nedendir. Genellikle program mantığı doğruysa, bazı iç veri yapılarının sırası, çoğu durumda zararlı olmayan farklı olabilir. senin farklı dizine, dize tablosu, sembol masa, DWARF kodu derleme beri

Ve ayrıca, 'objdump -D çıktı karşılaştırmak yoksa veya eh_frame farklı olmalıdır. Kesinlikle çok farklı çizgiler alacaksınız.

mantıklı gelen tek karşılaştırma yalnızca metin bölümünün ilgilenir 'objdump -d' çıktı karşılaştırmaktır. Metin bölümü aynıysa (benzer) o zaman aynı kabul edilebilir.

İlgili konular