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

2024-11-06 08:34:00
admin
原创
266
摘要:问题描述:我在 Ubuntu 中有一个 ARM 交叉编译器(arm-linux-gnueabi-gcc),默认架构是 ARMv7。但是,我想编译 ARMv5 二进制文件。我通过为编译器提供选项来实现这一点-march=armv5te。到目前为止一切顺利。由于我的 ARM 系统使用 BusyBox,因此我必须以...

问题描述:

我在 Ubuntu 中有一个 ARM 交叉编译器(arm-linux-gnueabi-gcc),默认架构是 ARMv7。但是,我想编译 ARMv5 二进制文件。我通过为编译器提供选项来实现这一点-march=armv5te

到目前为止一切顺利。由于我的 ARM 系统使用 BusyBox,因此我必须以静态链接方式编译二进制文件。因此我给了 gcc 这个-static选项。

但是,链接器链接到我的 ARMv5 二进制文件的libc.a存在问题。此文件使用 ARMv7 架构选项进行编译。因此,即使我将 ARM 二进制文件与 ARMv5 进行交叉编译,也无法在基于 BusyBox 的 ARMv5 机器上运行它。

  1. 我该如何解决这个问题?

  2. 在哪里可以获得 ARMv5 libc.a静态库,以及如何链接它?

先感谢您。


解决方案 1:

你有两个选择,

  1. 获取正确的编译器。

  2. 编写您自己的“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系统的正确编译器(可能具有更高级的代码生成功能)。这似乎很麻烦,但上述替代方案也不容易。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用