मिनिमल लिनक्स IA-32 उदाहरण है कि इसके उपयोग
main.S दिखाता है:
.section .text
.global _start
_start:
/* Dummy access so that after will be referenced and kept. */
mov after, %eax
/*mov keep, %eax*/
/* Exit system call. */
mov $1, %eax
/* Take the exit status 4 bytes after before. */
mov $4, %ebx
mov before(%ebx), %ebx
int $0x80
.section .before
before: .long 0
/* TODO why is the `"a"` required? */
.section .keep, "a"
keep: .long 1
.section .after
after: .long 2
लिंक।ld:
ENTRY(_start)
SECTIONS
{
. = 0x400000;
.text :
{
*(.text)
*(.before)
KEEP(*(.keep));
*(.keep)
*(.after)
}
}
संकलित करें और चलाने के:
as --32 -o main.o main.S
ld --gc-sections -m elf_i386 -o main.out -T link.ld main.o
./main.out
echo $?
आउटपुट:
1
अगर हम बाहर टिप्पणी KEEP
लाइन उत्पादन होता है:
2
हम या तो हैं:
- जोड़ने एक डमी
mov keep, %eax
--gc-sections
उत्पादन 1
वापस चला जाता है हटा दें।
उबंटू 14.04, बिनुटिल्स 2.25 पर परीक्षण किया गया।
स्पष्टीकरण:
प्रतीक keep
के लिए कोई संदर्भ नहीं है, और इसलिए अपनी अनुभाग .keep
हैं।
इसलिए यदि कचरा संग्रह सक्षम है और हम अपवाद बनाने के लिए KEEP
का उपयोग नहीं करते हैं, तो वह अनुभाग निष्पादन योग्य में नहीं रखा जाएगा।
हम before
का पता करने के लिए 4 जोड़ रहे हैं, अगर keep
अनुभाग मौजूद नहीं है, फिर बाहर निकलें स्थिति 2
, जो अगले .after
खंड पर मौजूद है हो जाएगा के बाद से।
TODO: .keep
से "a"
को हटाते हुए कुछ भी नहीं होता है, जो इसे आवंटित करता है। मुझे समझ में नहीं आता कि ऐसा क्यों है: वह अनुभाग .text
सेगमेंट के अंदर रखा जाएगा, जिसके कारण इसका जादू नाम आवंटित होगा।
स्रोत
2015-10-08 10:44:42
KEEP मैन्युअल के [इस] (https://sourceware.org/binutils/docs/ld/Input-Section-Keep.html#Input-Section-Keep) संस्करण में प्रलेखित है। – alexei