GCC извлечь список символов и ссылку на другие изображения
Все, что я пытаюсь сделать, извлечь некоторые символы из изображения и использовать (связать) символы из другого изображения.
С помощью armccc/armlink, когда задается параметр --symdefs=, создается файл, содержащий символы и их адреса.
С другой стороны, если вы удаляете неиспользуемые символы, он просто обновляет существующие символы. И если вы включите этот файл в компиляцию, он связывает символы предыдущего изображения с новым изображением.
Но я не могу найти аналогичный подход для инструментария GNU (arm-none-eabi-). если я использую arm-none-eabi-nm, он создает список символов, например, armcc --symdefs, но не может найти способ использовать этот список символов с компиляцией второго изображения. (Также нет способа отфильтровать символы без grep).
Другой вариант, кажется, также использует arm-none-eabi-objcopy, но не может найти, как использовать его с компиляцией второго изображения.
В GNU toolchain, как мы можем это сделать? Любая идея?
С другой стороны, я хочу применить это для Keil uVision IDE, если это возможно. Благодарю.
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