栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

您有两种选择,

  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, %1nt"     "mov    r1, %2nt"     "mov    r2, %3nt"     "mov    r7, %4nt"     "swi    #0nt"     "mov    %0, r0nt"     : "=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, %0nt"     "mov    r7, %1nt"     "swi    #0nt"     : : "r" (status),       "Ir" (__NR_exit)     : "r0", "r7");}

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

int main (int argc, char*argv[]){    write(STDOUT, "Hello worldn", sizeof("Hello worldn"));    return 0;}void __attribute__ ((unused)) estart (int argc, char*argv[]){    int rval = main(argc,argv);    exit(rval);}void __attribute__ ((naked)) _start (void){    asm(" sub     lr, lr, lrn"           " ldr     r0, [sp]n"             " add     r1, sp, #4n"           " b       estartn"               );}

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

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

诸如crosstool-ng之类的项目可以使您构建完全适合 armv5
系统的正确编译器(也许使用更高级的代码生成)。这看起来似乎很痛苦,但是上面的替代方法也不容易。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/408744.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号