0

このコマンドでいくつかのテキストファイルをリンクしました:

ld -r -b binary -o resources1.o * .txt

そして、私はこのコンテンツを含むファイルresources.oを取得します:

nmリソース1.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

別のldコマンドから来る他のresources2.oファイルがありますが、内容が異なります。

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

2つのresources.oファイルを1つのlibSum.aファイルに結合したいと思います。だから私はこのコマンドを使用します:

ar rvs libSum.a resources1.o resources2.o

libSum.aをCプログラムにリンクしてそれらのテキストを使おうとすると、同じメモリオフセットを共有しているために使用できません。したがって、バイナリ__textos1_texto1_txt_startは、_binary_texto4_txt_start(0X00000000)と同じ方向になります。

両方のリソースファイルを1つの.alibに結合して、メモリオフセットの重複を回避するにはどうすればよいですか?ありがとう

4

1 に答える 1

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」ファイルをリンクすることを忘れないでください。

于 2012-12-03T12:41:09.647 に答える