2012-11-30 69 views
0

我已經聯繫了一些文本使用此命令文件:內存與LD和AR重疊命令

LD -r -b二進制-o resources1.o * .TXT

我也得到一個文件resources.o與此內容:

納米resources1.o

00000018 D _binary_texto4_txt_end 
00000018 A _binary_texto4_txt_size 
00000000 D _binary_texto4_txt_start 
00000031 D _binary_texto5_txt_end 
00000019 A _binary_texto5_txt_size 
00000018 D _binary_texto5_txt_start 
0000004a D _binary_texto6_txt_end 
00000019 A _binary_texto6_txt_size 
00000031 D _binary_texto6_txt_start 

我有其他resources2.o文件從另一個ld命令正在添加,但它有diferent內容:

00000018 D _binary___textos1_texto1_txt_end 
00000018 A _binary___textos1_texto1_txt_size 
00000000 D _binary___textos1_texto1_txt_start 
00000031 D _binary___textos1_texto2_txt_end 
00000019 A _binary___textos1_texto2_txt_size 
00000018 D _binary___textos1_texto2_txt_start 
0000004a D _binary___textos1_texto3_txt_end 
00000019 A _binary___textos1_texto3_txt_size 
00000031 D _binary___textos1_texto3_txt_start 

我想這兩個resources.o文件在一個libSum.a文件合併。所以我用這個命令:

AR RVS libSum.a resources1.o resources2.o

當我鏈接libSum.a我的C程序,並嘗試使用這些文字,我不能因爲他們共享相同的內存偏移量。因此二進制 __textos1_texto1_txt_start具有與_binary_texto4_txt_start(0X00000000)相同的方向。

如何將兩個資源文件合併到一個.a庫中以避免內存偏移重疊? 謝謝

回答

0

文件內容有一個愚蠢的錯誤。它們是具有不同名稱的相同文件(副本&粘貼錯誤),因此在顯示其內容時似乎是內存偏移錯誤。

到現在爲止,我使用的下一個腳本編譯我的所有資源在「libResources.a」庫:

rm libResources.a 
rm names.txt 

basedir=$1 
for dir in "$basedir"/*; do 
    if test -d "$dir"; then 
    rm "$dir"/*.o 
    ld -r -b binary -o "$dir"/resources.o "$dir"/* 
    nm "$dir"/resources.o >> names.txt 
    fi 
done 

for dir in "$basedir"/*; do 
    if test -d "$dir"; then 
    ar q libResources.a "$dir"/*.o 
    fi 
done 

來測試我的硬編碼的資源我用下面的C代碼:

/* 
============================================================================ 
Name  : linkerTest.c 
============================================================================ 
*/ 

#include <stdio.h> 
#include <stdlib.h> 

extern char _binary___textos1_texto1_txt_start[]; 
extern char _binary___textos1_texto1_txt_end[]; 

extern char _binary___textos2_texto4_txt_start[]; 
extern char _binary___textos2_texto4_txt_end[]; 

int main(void) { 
    int i; 
    int sizeTexto1 = _binary___textos1_texto1_txt_end - _binary___textos1_texto1_txt_start; 
    int sizeTexto4 = _binary___textos2_texto4_txt_end - _binary___textos2_texto4_txt_start; 


    for (i=0;i<sizeTexto1;i++){ 
     putchar(_binary___textos1_texto1_txt_start[i]); 
    } 

    for (i=0;i<sizeTexto4;i++){ 
     putchar(_binary___textos2_texto4_txt_start[i]); 
    } 

    return EXIT_SUCCESS; 
} 

如果你想測試我的例子,不要忘記在你的項目中鏈接文件「libResources.a」。