ARM 交叉编译时如何选择要链接的静态库?
- 2024-11-05 08:37:00
- admin 原创
- 29
问题描述:
我在 Ubuntu 中有一个 ARM 交叉编译器(arm-linux-gnueabi-gcc),默认架构是 ARMv7。但是,我想编译 ARMv5 二进制文件。我通过为编译器提供选项来实现这一点-march=armv5te
。
到目前为止一切顺利。由于我的 ARM 系统使用 BusyBox,因此我必须以静态链接方式编译二进制文件。因此我给了 gcc 这个-static
选项。
但是,链接器链接到我的 ARMv5 二进制文件的libc.a存在问题。此文件使用 ARMv7 架构选项进行编译。因此,即使我将 ARM 二进制文件与 ARMv5 进行交叉编译,也无法在基于 BusyBox 的 ARMv5 机器上运行它。
我该如何解决这个问题?
我可以在哪里获得 ARMv5 libc.a静态库,以及如何链接它?
先感谢您。
解决方案 1:
你有两个选择,
获取正确的编译器。
编写您自己的“C”库。
获取正确的编译器。
让编译器与您的系统匹配总是最安全的。这适用于 x86 Linux 和各种发行版。如果不同的编译器可以工作,您就很幸运了。交叉编译时会更加困难,因为编译器通常不会自动同步。尝试在 2014 年的 Ubuntu 系统上运行在 1999 年 x86 Mandrake Linux 上编译的程序。
除了指令兼容性(您已确定)之外,还有 ABI 和 OS 依赖关系。具体来说,armv7最有可能是硬浮点(具有浮点 FPU和寄存器调用约定),而您需要软浮点(模拟 FPU)。特定的glibc(或ucLibc)具有 Linux OS 的特定调用和期望。例如,线程的工作方式随着时间的推移而发生了变化。
编写自己的
您始终可以使用-fno-builtin
和-ffreestanding
以及-static
。然后您不能使用任何libc函数,但您可以自己对它们进行编程。
有外部源代码,如Mark Martinec 的 snprintfwrite()
和易于实现的构建块,
#define _SYS_IOCTL_H 1
#include <linux/unistd.h>
#include <linux/ioctl.h>
static inline int write(int fd, void *buf, int len)
{
int rval;
asm volatile ("mov r0, %1
"
"mov r1, %2
"
"mov r2, %3
"
"mov r7, %4
"
"swi #0
"
"mov %0, r0
"
: "=r" (rval)
: "r" (fd),
"r" (buf),
"r" (len),
"Ir" (__NR_write)
: "r0", "r1", "r2", "r7");
return rval;
}
static inline void exit(int status)
{
asm volatile ("mov r0, %0
"
"mov r7, %1
"
"swi #0
"
: : "r" (status),
"Ir" (__NR_exit)
: "r0", "r7");
}
你必须添加你自己的启动机制,由“C”库来负责,
/* Called from assembler startup. */
int main (int argc, char*argv[])
{
write(STDOUT, "Hello world
", sizeof("Hello world
"));
return 0;
}
/* Wrapper for main return code. */
void __attribute__ ((unused)) estart (int argc, char*argv[])
{
int rval = main(argc,argv);
exit(rval);
}
/* Setup arguments for estart [like main()]. */
void __attribute__ ((naked)) _start (void)
{
asm(" sub lr, lr, lr
" /* Clear the link register. */
" ldr r0, [sp]
" /* Get argc... */
" add r1, sp, #4
" /* ... and argv ... */
" b estart
" /* Let's go! */
);
}
如果这太令人生畏,因为您需要实现很多功能,那么您可以尝试获取各种库源并用它们重建-fno-builtin
,并确保这些库不会与不兼容的 Ubuntu 库链接。
像crosstool-ng这样的项目可以让你构建一个适合armv5系统的正确编译器(可能具有更高级的代码生成功能)。这似乎很麻烦,但上述替代方案也不容易。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件