2016-09-23 24 views
5

Bir nesneyi nasm kullanarak bir araya getirirken, tüm etiketlerin sonuçta ortaya çıkan .o dosyasında ve son ikilide bulunan simgeler olarak yer aldığını buldum.Tüm asm etiketleri yürütülebilir dosyada sembol haline geliyor

Bu, GLOBAL bildirdiğim işlev giriş noktaları için ve bölüm başlangıç ​​bölümleri için (örneğin, .text bölümü için) anlamlıdır, ancak basitçe döngü giriş noktaları olarak kullanılan etiketlerin ve bunların hepsinin yakın görünmesi garip görünüyor. çıktı dosyasında. Dahili uygulama ayrıntılarını sızdırmaya ek olarak, sembol tablosundaki alanı boşa harcar. Bu kısa montaj programı Verilen örnek için

:

GLOBAL _start 
_start: 
    xor eax, eax 
normal_label: 
    xor eax, eax 
.local_label: 
    xor eax, eax 
    xor edi, edi 
    mov eax, 231 ; exit(0) 
    syscall 

... kullanılarak oluşturulan yer:

nasm -f elf64 label-test.s 
ld label-test.o -o label-test 

Sonuçları l (yani yerel) nesne dosyası ve bağlantılı yürütülebilir hem de sembolleri :

objdump --syms label-test.o 

label-test.o:  file format elf64-x86-64 

SYMBOL TABLE: 
0000000000000000 l df *ABS* 0000000000000000 label-test.s 
0000000000000000 l d .text 0000000000000000 .text 
0000000000000002 l  .text 0000000000000000 normal_label 
0000000000000004 l  .text 0000000000000000 normal_label.local_label 
0000000000000000 g  .text 0000000000000000 _start 

Not her iki normal_label ve inci Yerel etiket local_label, sembol tablosunda sona erdi. Hepsi de yürütülebilir dosyanın sembol tablosunda bulunur.

Bu sembolleri son yürütülebilir dosyaya vermek istemiyorum. Nasm'a onları dahil etmemesini söyleyebilir miyim? Bu sembolleri kaldırabilecek --strip-all gibi ld'a geçebileceğim bazı seçenekler vardır, ancak aynı zamanda çalıştırılabilir her sembolünü de. Yani o oldukça sopayla yapar: o vb Gerçekten okunabilir yığın izleri, hata ayıklama için saklamak istediğiniz sembolleri, Peter Cordes tarafından belirtildiği gibi


FWIW, yasm tam olarak aynı sorunu yoktur ortadan kaldırır. Yukarıdaki gibi aynı şekilde inşa edilmiş elf64 .o dosyası ile (ama nasm yerine yasm ile, elde ederiz:

objdump --syms label-test-yasm.o 

label-test-yasm.o:  file format elf64-x86-64 

SYMBOL TABLE: 
0000000000000000 l df *ABS* 0000000000000000 label-test.s 
0000000000000004 l  .text 0000000000000000 
0000000000000002 l  .text 0000000000000000 
0000000000000000 l d .text 0000000000000000 .text 
0000000000000000 g  .text 0000000000000000 _start 

küresel _start etiket hala dahildir, ancak diğer iki etiket adlı değildir - bunlar yine de oradalar, 4 ve 2 numaralı ofsetler (üstteki listede satır 2 ve 3), daha fazla etiket eklenerek onaylanır - daha fazla isimsiz sembol üretilir

+0

yasm, bunu varsayılan olarak yapmaz. (Eğer '-gdwarf2' kullanırsanız –

+1

Huh, evet yapar. Yani belki birazcık bir tuhaflık. Bunu sorunun altına ekledim. '-g' maddelerinden bahsetmişsiniz ve bana hata ayıklama için birincil olarak eklenmiştir, ancak 'ld' komutundaki 'stst-debug 'öğesinin bunları (veya herhangi bir sembol) Nasm tarafından inşa edilen ikili dosyalar. – BeeOnRope

+0

Bu sefer çok daha fazla çaba gösterdim ve sanki sadece [bir burun sınırlaması] gibi görünebilir (https://forum.nasm.us/index.php?topic=1951.0). – BeeOnRope

cevap

3

Anlatabildiğim kadarıyla Bu sadece bir sınırlamadır, örneğin, posterin yaklaşık aynı sorunu olduğu (örneğin 32 bit olmasına rağmen) this forum post örneğine bakın. 64-bit ELF) ve bir sıyırma aleti kullanmak dışında bir çözüm sağlanmamıştır. hile yapmak gerekir

strip --discard-all label-test.o 

: Benim durumumda

, bu gibi nesne dosyasını sıyırma görünüyor. --discard-all seçeneğinin ismine rağmen, sadece yerel sembolleri çıkarır ve yalnızca global sembolleri bırakır.İşte dosyayı sıyırma önce sembol tablosunu var:

SYMBOL TABLE: 
0000000000000000 l df *ABS* 0000000000000000 label-test.s 
0000000000000000 l d .text 0000000000000000 .text 
0000000000000002 l  .text 0000000000000000 normal_label 
0000000000000004 l  .text 0000000000000000 normal_label.local_label 
0000000000000000 g  .text 0000000000000000 _start 

ve sonrası: yalnız .text bölüm sembolünü bırakacak kadar akıllı olduğunu özellikle

SYMBOL TABLE: 
0000000000000000 l df *ABS* 0000000000000000 label-test.s 
0000000000000000 l d .text 0000000000000000 .text 
0000000000000000 g  .text 0000000000000000 _start 

Not, yerel olsa bile. Elbette bu şerit seçeneği, faydasız (döngü etiketi) ve potansiyel olarak yararlı semboller, örneğin çeşitli araçlar ile doğru yığın izlerini vermek için gereken yerel fonksiyon giriş noktaları arasında gerçekten ayırt edemez. Bu konuda daha akıllı olmak istiyorsa

, seçerek seçici gömülü . sadece etiketleri şerit --wildcard ve --strip-symbol seçenekleri kullanarak sadece asm-yerel (bir . ile başlayan yani etiketleri) şerit olabilir.

Hala orada daha iyi bir cevap arıyorsanız daha iyi bir cevap arıyorum.

İlgili konular