Извлечение списка символов GCC и ссылка на другие изображения

Все, что я пытаюсь сделать, извлекая некоторые символы из изображения и используя (связывая) символы из другого изображения.

В armccc/armlink при указании --symdefs= создается файл, который включает символы и их адреса.
С другой стороны, если вы удаляете неиспользуемые символы, он просто обновляет существующие символы. И если вы включите этот файл в компиляцию, он свяжет символы предыдущего изображения с новым изображением.

Но я не могу найти аналогичный подход для набора инструментов GNU (arm-none-eabi-). если я использую arm-none-eabi-nm, он создает список символов, такой как опция armcc --symdefs, но не может найти способ использовать этот список символов с компиляцией второго изображения. (Также нет возможности фильтровать символы без grep).

Другой вариант, кажется, также использует arm-none-eabi-objcopy, но не смог найти, как использовать его и со вторым изображением.

Как мы можем это сделать в инструментальной цепочке GNU? Есть идеи?

С другой стороны, я хочу применить это для Keil uVision IDE, если это возможно. Спасибо.


person muratcakmak    schedule 02.01.2017    source источник


Ответы (1)


Не зная много о armcc, может быть довольно легко эмулировать это поведение с помощью стандартных инструментов GNU. Например. для создания файла symdef:

$ cat tmp.c
int foo() { return 0; }
int bar() { return 1; }
int main() { return 0; }
$ gcc tmp.c
$  readelf -sW a.out | grep GLOBAL | awk '{print $8 " " $2 }' | grep -v '^_' > symdef.lst

А затем используйте его для определения отсутствующих символов для компоновщика с помощью флага --defsym:

$ LDFLAGS=$(cat symdef.lst |  awk '{print "-Wl,--defsym=" $1 "=" $2}' | tr '\n' ' ')
$ echo $LDFLAGS
-Wl,--defsym=bar=0000000000400481 -Wl,--defsym=foo=0000000000400476 -Wl,--defsym=main=000000000040048
person yugr    schedule 02.01.2017
comment
Спасибо Югр. Я нашел вариант компоновщика для GCC. -Wl,--just-symbols=‹elf_image_path› Кажется, это работает, но использует огромный файл elf. Я бы предпочел просто общий объект и его адрес, например armcc. - person muratcakmak; 03.01.2017