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
yasm, bunu varsayılan olarak yapmaz. (Eğer '-gdwarf2' kullanırsanız –
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
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