2008-11-29 96 views
22

我有一個可用的鏈接描述文件。我想添加另一個數據部分,其內容直接從文件中拉出(ld不應該解析它並提取部分等)。我怎樣才能做到這一點?包含GNU ld鏈接描述文件的二進制文件

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 – 2018-02-21 12:24:45

回答

16

你可以嘗試使用objcopy將其轉換成一個正常的對象,你可以在鏈接,然後引用它的符號鏈接腳本像你會做一個正常的對象。從objcopy manual page

-B bfdarch --binary架構= bfdarch 轉化原始二進制輸入文件到一個對象 文件時是有用的。在這種情況下,輸出體系結構可以設置爲bfdarch。 如果輸入文件具有已知的bfdarch,則該選項將被忽略。 您可以通過引用由轉換過程創建的 特殊符號來訪問程序中的二進制數據。這些符號被稱爲_binary_objfile_start_binary_objfile_end_binary_objfile_size。例如您可以將圖片文件轉換爲 目標文件,然後使用這些符號在代碼中訪問它。

...其中objfile將被擴展爲輸入對象文件的名稱。請參閱--rename-section選項。

+0

`bfdarch`文本不是字面意思(而且不是需要)。有關混淆,請參閱[使用gcc arm toolchain鏈接任意數據](http://stackoverflow.com/questions/17265950/linking-arbitrary-data-using-gcc-arm-toolchain)。 – 2013-06-24 14:06:16

5

另一種解決方案是使用​​函數生成包含二進制字節的第二個鏈接描述文件,然後使用INCLUDE指令將其包含在前一個鏈接描述文件中。

您可以從您的二進制文件以下列方式使用hexdump生成腳本:

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

然後包括這樣說:

SECTIONS { 
    .text : { 

     /* ... */ 

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

     /* ... */ 
    } 
} 
6

你可以把原始文件,以在不同的章節程序集,然後將此部分包含在鏈接器腳本中。

首先您需要創建模板.S文件,例如。

.section .rawdata 
.incbin "blob1.raw" 

...和修改鏈接腳本,只要你喜歡它包括此節:

.data : { 

    *(.rawdata*) 

} 

您也可以到這裏看看here關於.S模板更多的詳細信息。