Tôi đang viết một trình tải ELF không gian người dùng đơn giản trong Linux (tại sao? Cho 'vui'). Trình tải của tôi tại thời điểm này khá đơn giản và được thiết kế để chỉ tải các tệp ELF được liên kết tĩnh có chứa mã vị trí độc lập.tải lại thời gian ELF di dời
Thông thường, khi một chương trình được tải bởi trình nạp ELF của hạt nhân, nó được nạp vào không gian địa chỉ riêng của nó. Như vậy, phân đoạn dữ liệu và đoạn mã có thể được tải tại địa chỉ ảo chính xác như được chỉ định trong các phân đoạn ELF.
Trong trường hợp của tôi, tuy nhiên, tôi yêu cầu địa chỉ từ hạt nhân qua mmap
và có thể hoặc không thể nhận được các địa chỉ được yêu cầu trong các phân đoạn ELF. Đây không phải là vấn đề đối với đoạn mã vì nó là vị trí độc lập. Tuy nhiên, nếu phân đoạn dữ liệu không được tải tại địa chỉ dự kiến, mã sẽ không thể tham chiếu chính xác mọi thứ được lưu trữ trong phân đoạn dữ liệu.
Thật vậy, trình tải của tôi có vẻ hoạt động tốt với một tệp thực thi lắp ráp đơn giản không chứa bất kỳ dữ liệu nào. Nhưng ngay sau khi tôi thêm một phân đoạn dữ liệu và tham chiếu nó, tệp thực thi không chạy đúng hoặc SEGFAULT.
Làm cách nào, nếu có thể, tôi có thể sửa bất kỳ tham chiếu nào đến phân đoạn dữ liệu để trỏ đến đúng địa điểm không? Có một phần di dời được lưu trữ trong tệp ELF (tĩnh) cho mục đích này không?
Lý do mmap() không thành công khi đưa ra các địa chỉ được yêu cầu do quá trình 'đang gọi mmap đã có các trang được phân bổ trong không gian địa chỉ của nó? –
Vâng, đây có lẽ là lý do. Tôi nghĩ về việc yêu cầu 'ld' để đặt mã/dữ liệu của tôi ở đâu đó" ngoài đường ", nhưng tôi đã tự hỏi nếu một giải pháp chung có thể được đầu tiên. Nếu tôi không nhận được bất kỳ phản ứng nào ở đây, tôi có thể tiếp tục và thử điều đó. –