9

this recent answer adresinden gcc ve clang öğelerinin hata ayıklama etkin olmasa bile ikili olarak metadata olarak bir yerdeki kaynak dosya adını eklediğini öğrendim.Genel C derleyicileri neden çıktıda kaynak dosya adı içeriyor?

Bunun neden iyi bir fikir olduğunu anlamıyorum. Küçük gizlilik risklerinin yanı sıra, bu sonuç, sonuçta ortaya çıkan ikili (-Os) boyutunun optimize edilmesi durumunda etkin olur.

Derleyiciler neden bu bilgileri içeriyor?

+2

Sadece GCC değil, Clang bunu yapar (ve [spesifikasyon] 'u takip eden ELF ikili dosyalarını oluşturan herhangi bir derleyici araç zinciri (http://flint.cs.yale.edu/cs422/doc/ELF_Format.pdf)). – cyphar

+1

@cyphar Sadece 60 sayfanın tamamını okumak yerine içine girdiğimi itiraf ettim, ancak bu belgenin sadece sayfa 25'inde belirtilen DOSYA'yı buldum ve bunun zorunlu olduğunu söylemiyor ("Geleneksel olarak, sembolün adı" nesne dosyası ile ilişkili kaynak dosya. –

+0

Ayrıca, 60 sayfanın hepsini okumadım. Ama standartlara gelince “geleneksel olarak”, “bunu yapman gerekiyor çünkü insanlar buna güvenebilir”. Günün sonunda, bir özellik verilirse, mektubunuza uymak daha kolaydır (kullanıcılarınız standartta ifade edilen en ezoterik özellikleri kullanmaya karar verebilirlerse), denemek ve yolunuzu yitirmek yerine zorunda olmadığınız şeyleri uygulamak. Her şeyden önce, GNU, fazladan ekstra özelliklerin ülkesidir. – cyphar

cevap

6

GCC hangi kaynak verilen bir sembol (tersely) ELF spec p1-17 açıklanacak ve some Oracle docs on linking in sırasında genişletilmiş olarak geliyor dosyasını bir programcı belirlemenizi sağlar çünkü dosya adı, hata ayıklama amacıyla esas olduğunu içermektedir nedeni.

STT_FILE bölümünü kullanma örneği this SO question tarafından verilir.

-g0 belirtseniz bile yine de neden GCC ve Clang'ın içerdiğini hala karıştırıyorum, ancak -s ile STT_FILE'u dahil etmeyi durdurabilirsiniz. Bunun için herhangi bir açıklama bulamadım ve STT_FILE'un ELF belirtimine (yani çok terse) neden "resmi bir neden" bulabilirim.

5

Ben gcc etkin değil ayıklama bile, bir yerlerde meta veri olarak ikili kaynak dosya adı içerdiğini bu son cevap öğrendik.

Oldukça. Modern ELF nesnede gerçekten bir dosya adı Boyutu tip FILE bir sembolüdür:

Ancak bir kez soyulmuş, sembol gitmiş
$ readelf bignum.o # Source bignum.c 
[...] 
Symbol table (.symtab) contains 36 entries: 
    Num: Value   Size Type Bind Vis  Ndx Name 
    0: 0000000000000000  0 NOTYPE LOCAL DEFAULT UND 
    1: 0000000000000000  0 FILE LOCAL DEFAULT ABS bignum.c 
    2: 0000000000000000  0 SECTION LOCAL DEFAULT 1 
    3: 0000000000000000  0 SECTION LOCAL DEFAULT 3 
    4: 0000000000000000  0 SECTION LOCAL DEFAULT 4 
    5: 0000000000000000  0 SECTION LOCAL DEFAULT 5 
    6: 0000000000000000  0 SECTION LOCAL DEFAULT 6 
    7: 0000000000000000  0 SECTION LOCAL DEFAULT 7 
    8: 0000000000000000  0 SECTION LOCAL DEFAULT 8 
    9: 00000000000003f0 172 FUNC GLOBAL DEFAULT 1 add 
    10: 00000000000004a0 104 FUNC GLOBAL DEFAULT 1 copy 

:

$ strip bignum.o 
$ readelf -all bignum.o | grep bignum.c 
$ 

Yani, gizliliğinizi korumak yürütülebilir şerit, veya -s ile derleyin/bağlayın.

+1

Neden "tam olarak" değil?Bunu, bunu kaldırmak için kolaylaştıran bir şekilde gömülü olduğunu doğru bir şekilde işaret etseniz de, bunu "ikiliye dahil" olarak sayıyorum. Benim sorum yine de motivasyon hakkındaydı. –

+1

@FedericoPoloni Sadece "değil" için çok ince bir sebep: bir sembol tablosu meta veri nedir? Başarılı bir bağlantı için * gereklidir *. Ancak, hata ayıklama verileri, kendi ELF bölümüne sahip değildir ve kaldırılabilir. Bu gerçekten büyük bir sorun değil ve anlama yolunda durmamalıdır. – Jens

+1

Genel olarak sembol tablosunun bağlantı için gerekli olmasına rağmen, bu sembol yoktur. Bu nedenle, sembol tablosunu bazı meta verileri tutacak bir yer olarak kullanıyor. – Barmar