在ARM交叉编译时,如何选择要链接的静态库?

我在Ubuntu(arm-linux-gnueabi-

gcc)中有一个ARM编译" title="交叉编译">交叉编译器,默认体系结构是ARMv7。但是,我想编译一个ARMv5二进制文件。我通过为编译器提供-march=armv5te选项来实现。

到目前为止,一切都很好。由于我的ARM系统使用BusyBox,因此必须编译静态链接的二进制文件。所以我给gcc -static选项。

但是,链接器链接到我的ARMv5二进制文件的 libc.a

出现问题。该文件使用ARMv7体系结构选项进行编译。因此,即使我将ARM二进制文件与ARMv5交叉编译,也无法在基于BusyBox的ARMv5机器上运行它。

  1. 我怎么解决这个问题?
  2. 在哪里可以获得ARMv5 libc.a 静态库,如何链接它?

先感谢您。

回答:

您有两种选择,

  1. 获取正确的编译器。
  2. 编写自己的“ C”库。

回答:

你是 最安全的有一个编译器匹配您的系统。这适用于x86

Linux和各种发行版。如果不同的编译器可以工作,您将很幸运。当您交叉编译时,这样做会更加困难,因为编译器通常不会自动同步。尝试在2014

Ubuntu系统上编译的1999 x86 Mandrake Linux上运行程序。

除了指令兼容性(您已确定)外,还存在ABI和OS依赖性。具体来说, armv7 最有可能是 浮点 (具有 浮点FPU

和注册调用约定),您需要 (模拟的FPU)。特定的 glibc (或 ucLibc )具有Linux操作系统的特定调用和期望。例如,

线程的 工作方式已经随着时间而改变。

回答:

您可以随时使用-fno-builtin-ffreestanding以及-static。然后,您将无法使用任何 libc

函数,但可以自行编程。

有外部资源,例如Mark

Martinec的snprintf和write()易于实现的构建基块,

#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\n\t"

"mov r1, %2\n\t"

"mov r2, %3\n\t"

"mov r7, %4\n\t"

"swi #0\n\t"

"mov %0, r0\n\t"

: "=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\n\t"

"mov r7, %1\n\t"

"swi #0\n\t"

: : "r" (status),

"Ir" (__NR_exit)

: "r0", "r7");

}

您必须添加自己的启动机制,由“ C”库负责,

/* Called from assembler startup. */

int main (int argc, char*argv[])

{

write(STDOUT, "Hello world\n", sizeof("Hello world\n"));

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\n" /* Clear the link register. */

" ldr r0, [sp]\n" /* Get argc... */

" add r1, sp, #4\n" /* ... and argv ... */

" b estart\n" /* Let's go! */

);

}

如果这太令人生畏,因为您需要实现很多功能,那么您可以尝试获取各种库源并使用它们进行重建,-fno-

builtin并确保这些库不会与不兼容的Ubuntu库链接。

诸如crosstool-ng之类的项目可以使您构建完全适合 armv5

系统的正确编译器(也许使用更高级的代码生成)。这看起来似乎很痛苦,但是上面的替代方法也不容易。

以上是 在ARM交叉编译时,如何选择要链接的静态库? 的全部内容, 来源链接: utcz.com/qa/432328.html

回到顶部