2010-07-16 30 views
6

Tôi đang tìm cách đơn giản để sắp xếp lại các phần tệp ELF. Tôi có một chuỗi các phần tùy chỉnh mà tôi muốn tất cả được căn chỉnh theo một thứ tự nhất định.Cách đơn giản để sắp xếp lại các phần tệp ELF

Cách duy nhất tôi tìm thấy cách thực hiện là sử dụng tập lệnh Trình liên kết. Tuy nhiên tài liệu chỉ ra rằng việc chỉ định một kịch bản liên kết tùy chỉnh sẽ ghi đè mặc định. Kịch bản trình liên kết mặc định có rất nhiều nội dung trong đó tôi không muốn phải sao chép trong tập lệnh tùy chỉnh của mình chỉ để có được ba phần luôn cùng nhau theo một thứ tự nhất định. Nó không có vẻ rất linh hoạt để mã cứng hành vi liên kết như thế.

Tại sao tôi muốn thực hiện việc này? Tôi có một phần dữ liệu mà tôi cần biết vị trí bộ nhớ thời gian chạy (bắt đầu và kết thúc). Vì vậy, tôi đã tạo hai phần bổ sung và đặt các biến sentinel vào chúng. Sau đó tôi muốn sử dụng các vị trí bộ nhớ của các biến đó để biết phạm vi của phần không rõ trong bộ nhớ.

.markerA 
    int markerA; 
.targetSection 
    ... Lots of variables ... 
.markerB 
    int markerB; 

Trong ví dụ trên, tôi sẽ biết rằng dữ liệu trong .targetSection nằm giữa địa chỉ của markerA và markerB.

Có cách nào khác để thực hiện việc này không? Có thư viện nào cho phép tôi đọc trong hình ảnh ELF hiện đang thực hiện và xác định vị trí và kích thước của phần không?

+1

Chuỗi công cụ của bạn (trình biên dịch/trình liên kết) là gì? Bạn có thể sao chép-dán tập lệnh trình liên kết mặc định vào một tệp khác và chỉ thay đổi những gì bạn muốn ... –

+0

Tôi đang sử dụng gcc. Tôi biết tôi có thể xuất tập lệnh trình liên kết hiện tại, sửa đổi và sử dụng nó. Tuy nhiên, có thể có hàng trăm ứng dụng này, không phải tất cả được phát triển bởi nhóm của chúng tôi và tôi ghét phải liên kết tất cả chúng với phiên bản "cũ" của tập lệnh trình liên kết. Tôi đã hy vọng có một cách để đặt hàng một số phần mà không can thiệp vào phần còn lại của hành vi liên kết. – MrSlippers

+0

Có lý do gì khiến bạn sử dụng tập lệnh liên kết không? Có lẽ bạn có thể đặt các biến của bạn vào cấu trúc dữ liệu khung (struct, class, ...) và phân bổ một biến tĩnh. – Uhli

Trả lời

4

Bạn có thể lấy địa chỉ các phần đã tải bằng cách phân tích định dạng tệp ELF. Có thể tìm thấy chi tiết, ví dụ: trong

  • Tool Interface Standard (TIS) Định dạng xách tay kỹ thuật, phiên bản 1.2 (http://refspecs.freestandards.org/elf/elf.pdf)

cho một ấn tượng ngắn mà thông tin có giá trị để xem chính mình

readelf -S <filename> 

trả về danh sách tất cả các mục có trong đó.

  1. Các phần được ánh xạ vào bộ nhớ đã được nhập PROGBITS.
  2. Địa chỉ bạn đang tìm kiếm được hiển thị trong cột Addr.
  3. Để có được vị trí bộ nhớ, bạn phải thêm địa chỉ tải của thực thi/đối tượng chia sẻ của bạn

Có một vài cách để xác định địa chỉ tải của thực thi/đối tượng chia sẻ của bạn:

  1. bạn có thể phân tích cú pháp/proc/[pid]/maps (cột đầu tiên chứa địa chỉ tải). [pid] là id quá trình
  2. nếu bạn biết một hàm chứa trong tệp của mình, bạn có thể áp dụng dlsym để nhận con trỏ đến hàm.con trỏ đó là tham số đầu vào cho dladdr trả lại một struct Dl_info chứa địa chỉ tải được yêu cầu

Để có được một số thông tin ELF thư viện

  • libelf

có thể là một companian hữu ích (I phát hiện ra nó sau khi nghiên cứu TIS đã đề cập ở trên vì vậy tôi chỉ xem xét một chút về nó và tôi không biết chi tiết hơn)

Tôi hy vọng bản phác thảo này của một giải pháp có thể sẽ giúp ích cho bạn.

1

Bạn có thể xem xét sử dụng trình khởi tạo của GCC để tham chiếu các biến sẽ đi vào một phần riêng biệt khác và duy trì tất cả các con trỏ của chúng trong một mảng. Tôi khuyên bạn nên sử dụng trình khởi tạo vì công cụ này độc lập với tệp.

0

Bạn có thể xem ELFIO library. Nó chứa các ví dụ WriteObj và Writer. Bằng cách sử dụng thư viện, bạn sẽ có thể tạo/sửa đổi tệp nhị phân ELF theo lập trình.

0

Tôi sợ ghi đè lên tập lệnh liên kết mặc định là giải pháp đơn giản.

Vì bạn lo lắng về nó có thể không linh hoạt (thậm chí tôi nghĩ kịch bản liên kết thay đổi thường xuyên), bạn có thể viết kịch bản để tạo tập lệnh liên kết dựa trên script ld mặc định của hệ thống lưu trữ ("ld --verbose") và chèn các phần đặc biệt của bạn vào đó.

Các vấn đề liên quan