Ven*_*emo 6 interop arm static-libraries gnu-toolchain iar
有一个供应商的软件,我想与之合作.他们有一个代码库,他们只能使用IAR Embedded Workbench进行编译(据我所知,他们的代码不能用GCC编译).不幸的是,他们的硬件仅适用于他们的软件堆栈,所以我真的无法选择是否要使用它.它们将此代码分发.a为为ARM Cortex-M4 CPU编译的静态库文件(以及随附的标头).(他们不想分发来源.)为了这个讨论,让我们称之为evil_sw_stack.a.
我想使用这段代码,但我没有IAR许可证,对IAR没有专业知识.我想使用GCC.
有没有办法让IAR生成GCC可以链接到的静态库?供应商需要使用哪种编译器选项来生成这样的二进制文件?
(我猜测得到的二进制文件的ABI可以某种方式指定并设置为满足GCC的设置.)
他们的默认软件堆栈非常适合GCC,这个特定的软件堆栈是他们提供的唯一一个不是.通常,如果我有以下内容,我可以编译一段简单的示例代码:
startup_(devicename).S:GCC特定的程序集文件system_(devicename).c(devicename).ld:链接器脚本例如,我可以编译一个简单的例子,如下所示:
$ arm-none-eabi-gcc helloworld.c startup_(devicename).S system_(devicename).c -T (devicename).ld -o helloworld -D(devicename) -I. -fno-builtin -ffunction-sections -fdata-sections -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mcpu=cortex-m4 -mthumb -mno-sched-prolog -Wl,--start-group -lgcc -lc -lnosys -Wl,--end-group
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.没有警告,没有错误.
为了这个讨论,让我们称之为evil_sw_stack.a.
这就是我尝试使用它的方式:
$ arm-none-eabi-gcc evil_sw_stack.a helloworld.c startup_(devicename).S system_(devicename).c -T (devicename).ld -o helloworld -D(devicename) -I. -fno-builtin -ffunction-sections -fdata-sections -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mcpu=cortex-m4 -mthumb -mno-sched-prolog -Wl,--start-group -lgcc -lc -lnosys -Wl,--end-group
Run Code Online (Sandbox Code Playgroud)
不幸的是,这抱怨了一系列定义的函数的多个定义system_(devicename).c.也许他们不小心把它编成了这个库?或者也许IAR只是这样编译?现在,如果我尝试system_(devicename).c从GCC命令行中删除并只是链接到该.a文件,我会收到以下错误:
/usr/lib/gcc/arm-none-eabi/5.2.0/../../../../arm-none-eabi/bin/ld: warning: thelibrary.a(startup_chipname.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail
undefined reference to `__iar_program_start'
undefined reference to `CSTACK$$Limit'
undefined reference to `__iar_program_start'
Run Code Online (Sandbox Code Playgroud)
调用文件readelf让我无处可寻:
$ readelf -h evil_sw_stack.a
readelf: Error: evil_sw_stack.a: did not find a valid archive header
Run Code Online (Sandbox Code Playgroud)
有趣的是,这似乎在某处:
$ arm-none-eabi-ar x evil_sw_stack.a
Run Code Online (Sandbox Code Playgroud)
现在我有一堆目标文件确实有ELF标题readelf,并且是的,他们确实将一个启动文件(他们的另一个设备)编译到库中...我想知道为什么,但我想这个是一个错误.
这也有效:
$ arm-none-eabi-objdump -t evil_sw_stack_objfile.o
Run Code Online (Sandbox Code Playgroud)
所以现在的问题是,尝试使用GCC将这些目标文件编译到我自己的应用程序中是否安全?根据其他SO问题,目标文件格式不兼容.
我假设启动代码被错误地编译到库中.我可以删除它:
$ arm-none-eabi-ar d evil_sw_stack.a startup_(otherdevicename).o
$ arm-none-eabi-ar d evil_sw_stack.a system_(otherdevicename).o
Run Code Online (Sandbox Code Playgroud)
现在我得到一个evil_sw_stack.agcc可以接受作为输入而不抱怨.
然而,有一件事仍然让我担心.当我使用目标文件而不是静态库时,我收到以下警告:
/usr/lib/gcc/arm-none-eabi/5.2.0/../../../../arm-none-eabi/bin/ld: warning: evil_objfile.o uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail
/usr/lib/gcc/arm-none-eabi/5.2.0/../../../../arm-none-eabi/bin/ld: warning: evil_objfile.o uses 32-bit enums yet the output is to use variable-size enums; use of enum values across objects may fail
Run Code Online (Sandbox Code Playgroud)
所以它似乎evil_sw_stack.a是用(IAR等价物)-fno-short-enums和-fshort-wchar.当我evil_sw_stack.a在命令行使用时,GCC不会抱怨这个,但是当我尝试使用从库中提取的任何目标文件时,它会抱怨.我应该担心吗?
我没有wchar_t在我的代码中使用,所以我相信一个并不重要,但我想在我的代码和库之间传递枚举.
即使链接器没有抱怨,当我实际从静态库中调用某些函数时它也不起作用.在这种情况下,请确保在调用链接器时以正确的顺序放置库.根据对这个问题的接受答案,他们需要依赖于相反的顺序.在这样做之后,它仍然错过了一些IAR垃圾:
undefined reference to `__aeabi_memclr4'
undefined reference to `__aeabi_memclr'
undefined reference to `__aeabi_memmove'
undefined reference to `__aeabi_memset4'
undefined reference to `__aeabi_memset'
undefined reference to `__iar_vla_alloc2'
undefined reference to `__iar_vla_dealloc2'
undefined reference to `__aeabi_memclr4'
Run Code Online (Sandbox Code Playgroud)
我发现__aeabi函数是在定义的,libgcc但即使我也链接到libgcc,但是libgcc对于函数里面的定义似乎不够好evil_sw_stack.a.
编辑:经过一些谷歌搜索,似乎arm-none-eabi-gcc不支持这些特定的__aeabi功能.看看这个问题.
无论如何,在看了ARM的运行时ABI文档之后,__aeabi可以使用它们的标准C库等价物来简单地实现缺少的函数.但我不太清楚如何__iar_vla_alloc2和__iar_vla_dealloc2应该工作,无法在网上找到他们的任何文件.我发现的唯一的事情是VLA意味着"可变长度阵列".
因此,似乎除非芯片供应商能够以不使用这些符号的方式编译静态库,否则这将无法工作.是对的吗?
我不想透露供应商是谁,也不愿透露与我合作的产品.他们并不自豪,因为这件事不能正常工作,并且要求我不要这样做.我问这个问题是有帮助的,而不是抹黑他们.
| 归档时间: |
|
| 查看次数: |
2779 次 |
| 最近记录: |