एएमडी 64 आर्किटेक्चर के लिए लिनक्स असेंबली प्रोग्राम में आरआईपी रिलेटिव एड्रेसिंग का उपयोग कैसे करूं? मैं एक साधारण उदाहरण (एक हैलो वर्ल्ड प्रोग्राम) की तलाश में हूं जो एएमडी 64 आरआईपी सापेक्ष एड्रेसिंग मोड का उपयोग करता है।64-बिट असेंबली प्रोग्राम में आरआईपी रिलेटिव एड्रेसिंग का उपयोग कैसे करें?
उदाहरण के लिए निम्नलिखित 64-बिट विधानसभा कार्यक्रम सामान्य (निरपेक्ष को संबोधित कर रहे) के साथ काम करेगा:
.text
.global _start
_start:
mov $0xd, %rdx
mov $msg, %rsi
pushq $0x1
pop %rax
mov %rax, %rdi
syscall
xor %rdi, %rdi
pushq $0x3c
pop %rax
syscall
.data
msg:
.ascii "Hello world!\n"
मैं अनुमान लगा रहा हूँ कि सापेक्ष आरआईपी को संबोधित करते का उपयोग कर एक ही कार्यक्रम होगा कुछ की तरह:
.text
.global _start
_start:
mov $0xd, %rdx
mov msg(%rip), %rsi
pushq $0x1
pop %rax
mov %rax, %rdi
syscall
xor %rdi, %rdi
pushq $0x3c
pop %rax
syscall
msg:
.ascii "Hello world!\n"
सामान्य संस्करण ठीक चलता है जब साथ संकलित:
as -o hello.o hello.s && ld -s -o hello hello.o && ./hello
लेकिन मुझे आरआईपी संस्करण काम नहीं मिल रहा है।
कोई विचार?
--- संपादित ----
स्टीफन कैनन का जवाब आरआईपी संस्करण काम में आता है।
अब जब मैं आरआईपी संस्करण के निष्पादन योग्य एकत्रित न मैं:
objdump -d हैलो
0000000000400078 <.text>:
400078: 48 c7 c2 0d 00 00 00 mov $0xd,%rdx
40007f: 48 8d 35 10 00 00 00 lea 0x10(%rip),%rsi # 0x400096
400086: 6a 01 pushq $0x1
400088: 58 pop %rax
400089: 48 89 c7 mov %rax,%rdi
40008c: 0f 05 syscall
40008e: 48 31 ff xor %rdi,%rdi
400091: 6a 3c pushq $0x3c
400093: 58 pop %rax
400094: 0f 05 syscall
400096: 48 rex.W
400097: 65 gs
400098: 6c insb (%dx),%es:(%rdi)
400099: 6c insb (%dx),%es:(%rdi)
40009a: 6f outsl %ds:(%rsi),(%dx)
40009b: 20 77 6f and %dh,0x6f(%rdi)
40009e: 72 6c jb 0x40010c
4000a0: 64 21 0a and %ecx,%fs:(%rdx)
से पता चलता कौन सा है कि मैं क्या पूरा करने के लिए कोशिश कर रहा था: ली 0x10 (% RIP),% RSI पता 0x400096 पता है कि लीए निर्देश के बाद पता 17 बाइट्स लोड करता है जहां हैलो वर्ल्ड स्ट्रिंग मिल सकती है और इस प्रकार स्थिति स्वतंत्र कोड हो सकती है।
क्यों 17 बाइट्स (0x10 16 है)? – fadedbee
https://www.tortall.net/projects/yasm/manual/html/nasm-effaddr.html कहता है: 'आरआईपी निर्देश सूचक रजिस्टर है, जिसमें वर्तमान निर्देश के तुरंत बाद स्थान का पता शामिल है' लेकिन ' लीए निर्देश सात बाइट लंबा है, एक नहीं। – fadedbee
'mov' के बजाय' push'/'pop' जोड़े क्यों? –