nasm
का उपयोग करके किसी ऑब्जेक्ट को इकट्ठा करते समय, मुझे लगता है कि सभी लेबल परिणामस्वरूप .o
फ़ाइल के साथ-साथ अंतिम बाइनरी में प्रतीकों के रूप में शामिल किए गए हैं।सभी एएसएम लेबल निष्पादन योग्य फ़ाइल में प्रतीक बन रहे हैं
इस समारोह प्रवेश बिंदुओं कि मैं GLOBAL
घोषित किया है के लिए समझ में आता है, और अनुभाग के लिए भागों (जैसे, .text
अनुभाग के लिए) शुरू करते हैं, लेकिन यह अजीब लगता है कि लेबल बस पाश प्रवेश बिंदुओं के रूप में इस्तेमाल किया है और इस तरह के सभी के पास प्रकट करने के लिए आउटपुट फ़ाइल में। आंतरिक कार्यान्वयन विवरण लीक करने के अलावा, यह प्रतीक तालिका में स्थान को बर्बाद कर देता है।
उदाहरण के लिए, इस छोटे से विधानसभा कार्यक्रम को देखते हुए:
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
... का उपयोग करके बनाया:
मेंnasm -f elf64 label-test.s
ld label-test.o -o label-test
परिणाम l
(यानी, स्थानीय) दोनों वस्तु फ़ाइल और लिंक किए गए निष्पादन में प्रतीकों :
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
ध्यान दें कि normal_label
और वें ई स्थानीय लेबल local_label
प्रतीक तालिका में समाप्त हो गया। वे सभी निष्पादन योग्य की प्रतीक तालिका में भी समाप्त होते हैं।
मैं इन प्रतीकों को अंतिम निष्पादन योग्य में नहीं छोड़ना चाहता हूं। क्या मैं नस्ल को बता सकता हूं कि उन्हें शामिल न करें? कुछ विकल्प हैं जिन्हें मैं ld
पर भेज सकता हूं, जैसे --strip-all
, जो उन प्रतीकों को हटा देंगे, लेकिन निष्पादन योग्य में अन्य प्रतीक भी होंगे। यही कारण है कि यह बनाता है काफी लाठी: यह प्रतीकों मैं वास्तव में पठनीय स्टैक ट्रेस, डिबगिंग के लिए रखना चाहते हैं, आदि
Fwiw, के रूप में पीटर Cordes द्वारा उल्लेख किया है, yasm
बिल्कुल एक ही मुद्दा नहीं है दूर करता है। जैसा कि ऊपर बिल्कुल उसी तरह का निर्माण एक elf64 .o
फ़ाइल के साथ (लेकिन yasm
nasm
के लिए प्रतिस्थापित के साथ, हम पाते हैं:
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
वैश्विक _start
लेबल अभी भी शामिल किया गया है, लेकिन अन्य दो लेबल का नाम नहीं कर रहे हैं - वे अभी भी वहां हैं, वे ऑफ़सेट 4 और 2 (उपरोक्त सूची में लाइन 2 और 3) पर अज्ञात प्रतीकों हैं। यह अधिक लेबल जोड़कर पुष्टि की जाती है - अधिक सजाए गए प्रतीकों का उत्पादन होता है।
yasm डिफ़ॉल्ट रूप से ऐसा नहीं करता है। (यदि आप '-gdwarf2' का उपयोग करते हैं तो यह करता है) –
हू, हाँ। तो शायद यह एक नस्ल quirk का थोड़ा सा है। मैंने कहा कि सवाल के नीचे। आप '-g' सामान का उल्लेख करते हैं और यह मेरे लिए हुआ है, इन्हें डिबगिंग के लिए प्राथमिक जोड़ा गया है, लेकिन यह ध्यान देने योग्य है कि 'ld' कमांड पर' --strip-debug' उन (या किसी भी प्रतीक) को हटा नहीं देता है नस्ल द्वारा निर्मित द्विआधारी। – BeeOnRope
वैसे मैं इस बार कड़ी मेहनत कर रहा हूं और ऐसा लगता है कि यह सिर्फ [नासम में सीमा] हो सकता है (https://forum.nasm.us/index.php?topic=1951.0)। – BeeOnRope