Перекрытие памяти с командами ld и ar

Я связал некоторые текстовые файлы с помощью этой команды:

ld -r -b двоичный файл -o resources1.o *.txt

И получаю файл resources.o с таким содержимым:

нм ресурсы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

У меня есть другой файл resources2.o, полученный от другой команды ld, но он имеет другое содержимое:

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 и пытаюсь использовать эти тексты, я не могу, потому что они используют одни и те же смещения памяти. Таким образом, binary__textos1_texto1_txt_start имеет то же направление, что и _binary_texto4_txt_start (0X00000000).

Как я могу объединить оба файла ресурсов в одну библиотеку .a, избегая перекрытия смещения памяти? Спасибо


person Cesar Ortiz    schedule 30.11.2012    source источник


Ответы (1)


Произошла глупая ошибка с содержимым файла. Это был один и тот же файл с разными именами (ошибка копирования и вставки), поэтому при отображении его содержимого это выглядело как ошибка смещения памяти.

К настоящему времени я использую следующий скрипт для компиляции всех моих ресурсов в библиотеке «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» в вашем проекте.

person Cesar Ortiz    schedule 03.12.2012