2008-11-29 40 views
22

Tôi có một tập lệnh trình liên kết làm việc. Tôi muốn thêm một phần dữ liệu có nội dung được lấy trực tiếp từ một tập tin (ld không nên phân tích nó và trích xuất các phần và vv). Làm thế nào tôi có thể làm điều đó?Bao gồm tệp nhị phân với tập lệnh liên kết ld GNU

OUTPUT_FORMAT("elf32-i386") 
ENTRY(start) 
SECTIONS 
{ 
    .text 0x100000 : { 
    *(.multiboot) 
    *(.text) 
    *(.code) 
    *(.rodata*) 
    } 
    .data : { 
    *(.data) 
    } 
    .bss : { 
    *(.bss) 
    } 
    kernel_end = .; 
    roottask_start = .; 
    .data : { 

    HERE I WANT TO INCLUDE THE ENTIRE CONTENTS OF ANOTHER (BINARY) FILE 

    } 
    roottask_end = .; 
} 
+0

GCC: https://stackoverflow.com/questions/4864866/cc-with-gcc-statically-add-resource-files-to-executable-library –

Trả lời

16

Bạn có thể thử sử dụng objcopy để chuyển nó sang một đối tượng bình thường bạn có thể liên kết trong, và sau đó tham khảo những biểu tượng của nó trong kịch bản mối liên kết như bạn sẽ làm cho một đối tượng bình thường. Từ objcopy manual page:

-B bfdarch --binary kiến ​​trúc = bfdarch hữu ích khi chuyển đổi một tập tin đầu vào nhị phân thô thành một đối tượng tập tin. Trong trường hợp này, kiến ​​trúc đầu ra có thể được đặt thành bfdarch. Tùy chọn này sẽ bị bỏ qua nếu tệp đầu vào có bfdarch đã biết. Bạn có thể truy cập dữ liệu nhị phân này bên trong một chương trình bằng cách tham chiếu các ký hiệu đặc biệt được tạo bởi quá trình chuyển đổi. Những biểu tượng này được gọi là _binary_objfile_start, _binary_objfile_end_binary_objfile_size. ví dụ. bạn có thể chuyển đổi một tệp hình ảnh thành một tệp đối tượng và sau đó truy cập tệp đó trong mã của bạn bằng cách sử dụng các biểu tượng này.

... trong đó objfile sẽ được mở rộng đến tên của tệp đối tượng đầu vào.

Xem thêm tùy chọn --rename-section.

+0

Văn bản 'bfdarch' không có nghĩa đen (và không phải là cần thiết). Để khó hiểu, hãy xem [Liên kết dữ liệu tùy ý bằng cách sử dụng toolchain gcc armchain] (http://stackoverflow.com/questions/17265950/linking-arbitrary-data-using-gcc-arm-toolchain). –

5

Một giải pháp khác là tạo tập lệnh liên kết thứ hai chứa byte từ tệp nhị phân của bạn bằng cách sử dụng hàm BYTE và sau đó bao gồm nó trong tập lệnh liên kết cũ sử dụng chỉ thị INCLUDE.

Bạn có thể tạo ra các kịch bản từ tập tin nhị phân của bạn sử dụng hexdump theo cách sau:

cat ramelfs | hexdump -v -e '"BYTE(0x" 1/1 "%02X" ")\n"' > ramelfs.ld 

Và sau đó bao gồm nó theo cách này:

SECTIONS { 
    .text : { 

     /* ... */ 

     kramelfs = .; 
     INCLUDE "ramelfs.ld" ; 
     kramelfs_end = .; 

     /* ... */ 
    } 
} 
6

Bạn có thể đặt file raw để phần riêng biệt trong lắp ráp, và sau đó bao gồm phần này trong kịch bản liên kết.

Trước tiên, bạn cần tạo tệp mẫu .S, ví dụ:

.section .rawdata 
.incbin "blob1.raw" 

... và sửa đổi kịch bản mối liên kết để bao gồm phần này là bạn thích nó:

.data : { 

    *(.rawdata*) 

} 

Bạn cũng có thể có một cái nhìn ở đây here để biết thêm một chút thông tin chi tiết về .S mẫu.

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