2016-09-23 10 views
5

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 फ़ाइल के साथ (लेकिन yasmnasm के लिए प्रतिस्थापित के साथ, हम पाते हैं:

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) पर अज्ञात प्रतीकों हैं। यह अधिक लेबल जोड़कर पुष्टि की जाती है - अधिक सजाए गए प्रतीकों का उत्पादन होता है।

+0

yasm डिफ़ॉल्ट रूप से ऐसा नहीं करता है। (यदि आप '-gdwarf2' का उपयोग करते हैं तो यह करता है) –

+1

हू, हाँ। तो शायद यह एक नस्ल quirk का थोड़ा सा है। मैंने कहा कि सवाल के नीचे। आप '-g' सामान का उल्लेख करते हैं और यह मेरे लिए हुआ है, इन्हें डिबगिंग के लिए प्राथमिक जोड़ा गया है, लेकिन यह ध्यान देने योग्य है कि 'ld' कमांड पर' --strip-debug' उन (या किसी भी प्रतीक) को हटा नहीं देता है नस्ल द्वारा निर्मित द्विआधारी। – BeeOnRope

+0

वैसे मैं इस बार कड़ी मेहनत कर रहा हूं और ऐसा लगता है कि यह सिर्फ [नासम में सीमा] हो सकता है (https://forum.nasm.us/index.php?topic=1951.0)। – BeeOnRope

उत्तर

3

जहां तक ​​मैं कह सकता हूं , यह सिर्फ नासम में एक सीमा है। उदाहरण के लिए देखें this forum post जहां पोस्टर के पास लगभग एक ही समस्या है (हालांकि 32-बिट के बजाए 64-बिट ईएलएफ), और एक स्ट्रिपिंग टूल का उपयोग करने के अलावा कोई समाधान प्रदान नहीं किया जाता है।

मेरे मामले में, यह की तरह वस्तु फ़ाइल अलग करना लगता है:

strip --discard-all label-test.o 

चाल करना चाहिए। --discard-all विकल्प के नाम के बावजूद, यह केवल स्थानीय प्रतीकों को स्ट्रिप्स करता है और अकेले वैश्विक प्रतीकों को छोड़ देता है।यहाँ फ़ाइल अलग करना पहले प्रतीक तालिका है:

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 

और बाद: विशेष रूप से

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

ध्यान दें कि यह बहुत चालाक अकेले .text अनुभाग प्रतीक छोड़ने के लिए गया था, भले ही यह स्थानीय है। बेशक यह स्ट्रिप विकल्प वास्तव में बेकार (लूप लेबल) और संभावित रूप से उपयोगी प्रतीकों के बीच अंतर नहीं कर सकता है, उदाहरण के लिए स्थानीय फ़ंक्शन एंट्री पॉइंट्स जिन्हें विभिन्न टूल के साथ सही स्टैक निशान देने के लिए आवश्यक हैं।

आप इसके बारे में होशियार होने के लिए चाहते हैं तो आपके चुनिंदा केवल एएसएम-स्थानीय --wildcard और --strip-symbol विकल्पों का उपयोग चुनिंदा एक एम्बेडेड . के साथ ही लेबल पट्टी (यानी, किसी . के साथ शुरू लेबल) पट्टी सकता है।

यदि मैं वहां से बाहर निकल रहा हूं तो भी मैं एक बेहतर उत्तर की तलाश में हूं।

संबंधित मुद्दे