Theo dõi Why is the ELF execution entry point virtual address of the form 0x80xxxxx and not zero 0x0? và Why do virtual memory addresses for linux binaries start at 0x8048000?, tại sao tôi không thể thực hiện ld
sử dụng điểm nhập khác với điểm nhập mặc định với ld -e
?Tại sao điểm truy cập ELF 0x8048000 không thay đổi được với tùy chọn "ld -e"?
Nếu tôi làm như vậy, tôi có thể nhận được segmentation fault
với mã trả lại 139, ngay cả đối với địa chỉ gần điểm nhập mặc định. Tại sao?
EDIT:
tôi sẽ làm cho các câu hỏi cụ thể hơn:
.text
.globl _start
_start:
movl $0x4,%eax # eax = code for 'write' system call
movl $1,%ebx # ebx = file descriptor to standard output
movl $message,%ecx # ecx = pointer to the message
movl $13,%edx # edx = length of the message
int $0x80 # make the system call
movl $0x0,%ebx # the status returned by 'exit'
movl $0x1,%eax # eax = code for 'exit' system call
int $0x80 # make the system call
.data
.globl message
message:
.string "Hello world\n" # The message as data
Nếu tôi biên dịch này với as program.s -o program.o
và sau đó liên kết nó tĩnh với ld -N program.o -o program
, readelf -l program
show 0x0000000000400078
như VirtAddr
của văn bản phân đoạn và 0x400078
làm điểm vào. Khi chạy, `Hello world 'được in.
Tuy nhiên, khi tôi cố liên kết với ld -N -e0x400082 -Ttext=0x400082 program.o -o program
(phân đoạn văn bản di chuyển và điểm vào 4 byte), chương trình sẽ là killed
bây giờ hiển thị hai tiêu đề khác nhau kiểu LOAD
, một ở 0x0000000000400082
và một ở 0x00000000004000b0
.
Khi tôi cố gắng 0x400086
, tất cả các công trình, và chỉ có một LOAD
phần.
- gì đang xảy ra ở đây?
- Tôi có thể chọn địa chỉ bộ nhớ nào, những địa chỉ nào tôi không thể chọn và tại sao?
Cảm ơn bạn.
Tôi cũng đã có thể sửa đổi các điểm nhập với kịch bản mối liên kết: http://stackoverflow.com/a/30536800/895245 –