Извлечение архивного файла в скрипте компоновщика

Я пытаюсь решить проблему, подобную следующей:

Предположим, что у меня есть библиотека libxyz.a, созданная из:

/* main.c */
int main(void)
{
  int a;
}

скомпилировано и заархивировано с помощью:

gcc -c main.c -o abc.o && ar cr libxyz.a abc.o

Как мне написать скрипт компоновщика, чтобы разместить abc.o именно там, где он должен быть?

Я пытался справиться с этим таким образом:

/* script.ld */
SEARCH_DIR(.)
INPUT(-lxyz)
SECTIONS
{
   .text : { xyz:abc(.text) }
   .data : { xyz:abc(.data) }
   .bss  : { xyz:abc(.bss) }
}

но после запуска:

ld -T script.ld

Я получил:

ld: cannot find xyz:abc

Я не смог найти ни одного примера извлечения архивов из файлов компоновщика на форумах. Единственное, что я нашел, это документацию компоновщика, которая содержит информацию только о конструкции archive:file.


person nkdm    schedule 08.01.2013    source источник


Ответы (2)


Просто сегодня пришлось столкнуться с той же проблемой, поэтому, если кто-то еще столкнется с этим вопросом: некоторые расширения файлов отсутствуют. Что-то вроде работает нормально:

SECTIONS
{
   .text : { libxyz.a:abc.o(.text) }
   .data : { libxyz.a:abc.o(.data) }
   .bss  : { libxyz.a:abc.o(.bss) }
}

Также нужно разобраться с путями (если библиотека действительно где-то/libxyz.a).

person dbrank0    schedule 08.01.2014

Вероятно, проблема с вашим ld, потому что я пробовал ваш скрипт на своей машине, он работал правильно, без ошибок. моя старая версия — GNU ld (GNU Binutils для Ubuntu) 2.22

person hmatar    schedule 08.01.2013
comment
Хорошо, я изменил версию LD. Это не вызывает ошибку, но objdump -t a.out по-прежнему не представляет символ main - person nkdm; 08.01.2013