【问题标题】:What is the cause of not being able to divide numbers in GCCGCC中无法除数的原因是什么
【发布时间】:2011-07-04 22:23:14
【问题描述】:

我的情况很奇怪。每次我尝试编译我的 arm 项目(LPC2378,codesourcery arm-none-eabi-gcc-4.5.1)时,我在链接时都会遇到同样的错误

/media/data/Projects/arm/uart/main.c:39: undefined reference to `__aeabi_uidiv'
/media/data/Projects/arm/uart/main.c:40: undefined reference to `__aeabi_uidiv'

有问题的代码如下所示:

U0DLL = ((((PLLCFG & 0x7FFF) + 1) * F_OSC) / ((((PLLCFG & (0xFF << 16)) >> 16) + 1) * ((CCLKCFG & 0xFF) + 1) * 8 * BAUD * 1)) % 256;
U0DLM = ((((PLLCFG & 0x7FFF) + 1) * F_OSC) / ((((PLLCFG & (0xFF << 16)) >> 16) + 1) * ((CCLKCFG & 0xFF) + 1) * 8 * BAUD * 1)) / 256;

我已经四处搜索,这可能是由 AFAICT 引起的,没有使用 lgcc 和 lc 选项作为 LD。我已经解决了,但错误仍然存​​在。

完整的项目可以是found at my github repo

如果有人可以提供帮助,我们将不胜感激。干杯。

【问题讨论】:

  • 链接器标志的顺序有时很重要,试试:$(LD) -o main.out startup.o target.o fio.o irq.o main.o $(LDFLAGS)
  • Banthar 你是明星。多年来,我一直在努力解决问题,我从谷歌上搜索到的最好的结果是错误报告,最好的是 RMS 6 年前。
  • Banthar:那么最好把链接器标志放在最后吗?
  • @Regomo:您必须将 libraries 放在您自己的目标文件之后,因为缺少符号的解析方式。所有其他标志可以按任何顺序出现。

标签: c gcc makefile arm


【解决方案1】:

ARM 系列 CPU 没有本机整数除法指令。所以,除法需要通过库函数来实现。 GCC 知道这一点,并创建了对(在您的情况下)__aeabi_uidiv(对于 unsigned int 部门)的引用。

您需要链接到包含此函数的适当运行时支持库。

【讨论】:

  • 从 grepping 链接目录中链接了适当的库。事实证明,正如 banthar 指出的那样,是链接顺序导致了错误。
【解决方案2】:

我遇到了这个问题,并通过在Makefile 中传递libgcc.a 的正确位置来解决它。您可能需要添加:

"-L*path_to_libgcc.a* -lgcc" 

到 LDFLAGS

【讨论】:

    【解决方案3】:

    听起来像是工具链问题 - 也许您的 gcc 是为 ARM EABI 构建的,但您的库(libgcc?)是为传统 ABI 构建的?

    【讨论】:

      【解决方案4】:

      我通常避免使用分割,当我必须使用分割时,有时我会遇到这个问题。这些除法函数的(汇编程序)源代码在 gcc 源代码中,提取该代码并在 gcc 不合作时将其链接起来并不难。一旦你有一个删除了宏的版本,等等,一个干净的源,你可以把它放在你的后兜里。谷歌搜索我曾经发现建议是使用非 linux eabi,但正如您发现的那样,它并不总是有效,有时但并非总是如此。

      【讨论】:

        【解决方案5】:

        检查您的 libgcc.a 是否位于应该在的 codesourcery 目录中。我在使用 TI starterware 时遇到了同样的问题,它在其中一个 makefile 中修复了 libgcc.a 的路径。

        【讨论】:

        • 您提供的产品网站链接不包含有关此问题中错误的任何信息。像这样包含这些不相关的链接是完全不合适的——尤其是当它们是自我推销的时候。我正在为您删除链接,因此您的答案不会被标记为垃圾邮件。
        • 我认为网页上的信息很清楚。我给自己写了它,因为我遇到了完全相同的问题,但使用了不同的来源:1)当没有链接到 libgcc.a 时,你得到 __aeabi_uidiv 错误 2)libgcc.a 是 codesourcery 的一部分 3)它存储在版本控制目录中 4)如果您的 makefile 挂钩到不正确的版本,它根本不起作用。我不会在这里重复我已经在其他地方写过的内容,因此链接。如果你觉得不合适,那就顺其自然吧。 (实际上我会删除帖子,但它并没有被删除,它只是被标记了)
        猜你喜欢
        • 2017-04-10
        • 2015-01-26
        • 1970-01-01
        • 1970-01-01
        • 2017-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多