【问题标题】:Symbol not found __udivsi3找不到符号 __udivsi3
【发布时间】:2015-05-10 06:17:00
【问题描述】:

我将我的一个 Contiki 应用程序 (power-cons.c: 它评估 TelosB mote 的功耗) 编译为 Contiki 可执行文件 (power-cons.ce)。 Contiki的可执行文件然后通过串口上传到Sky平台并存储在文件系统中然后通过shell命令“exec”加载可执行文件。

但是在运行命令 exec 时会显示以下错误...

找不到符号 __udivsi3

如何解决这个符号?

【问题讨论】:

  • 为什么要使用动态链接?
  • this one 的问题非常相似。检查那里的答案是否有帮助。
  • @CL 当我在不使用“exec”命令的情况下动态链接(elf 加载器).ce 模块时,显示相同的错误符号未找到

标签: dynamic-linking msp430 contiki


【解决方案1】:

问题是,您的.ce 使用的所有功能都必须已经在您的 Sky 节点上(我称之为基础系统)。您的基础系统提供的所有符号都可以通过运行nm base-system.sky 列出。 .ce 需要的符号是运行 nm power-cons.ce 时标有 U 的符号。要解决您的问题,您有以下选择:

  • 不要使用__udivsi3 是您的.ce。它用于划分两个unsigned intmanual)。例如,您可以使用signed int
  • 在您的基本系统中使用__udivsi3
  • 添加
    void__udivsi3(void); void (*additional_symbol1)(void) = &void__udivsi3;
    到您的一个文件。不过,这将花费您两个字节。
  • 按照@finmor 的建议使用this answer 中提出的解决方案
  • 告诉链接器将该函数包含到您的基本系统中。这有点棘手,因为无法找到方便的方法。我做了一些实验,并没有我希望的那么简单。
  • 您可以将__udivsi3 添加到您的.ce。我不确定这样做的最佳或最简单的方法。可能您想从.a 中提取包含__udivsi3.o。这需要一些搜索。对于__udivsi3,它带有 gcc(而不是 libc)。然后您可以使用ld -r (starting point) 将其与您的power-cons.ce 合并。还有其他方法可以解决这个问题,但我必须做一些研究,因为我目前没有积极研究这个主题。

【讨论】:

  • 在“makefile.msp430”中添加了“LDFLAGS +=-Wl,--undefined=__udivsi3”。但它不起作用
  • void__udivsi3(void); void (*additional_symbol1)(void) = &void__udivsi3;这也行不通
  • @sijukoshy 我实际测试过。您必须将其添加到您的基本系统,而不是模块。
  • 当我使用“nm base system.sky”时,我可以看到“0000c914 T __udivsi3”并运行“nm power-cons.ce”,它会列出“U __udivsi3”。未找到相同的错误符号:__udivsi3 仍然存在。
  • 它是否显示在您的 symbols.c 中,它是在您的基础系统的构建时创建的?
【解决方案2】:

您可能需要与 libm 链接。

尝试将-lm 添加到您的链接器命令行。 还要确保 libm 在您的目标上可用。

【讨论】:

  • 我已经在makefile中添加了TARGET_LIBFILES += -lm ..但是显示同样的错误
猜你喜欢
  • 2014-04-11
  • 2013-09-12
  • 2013-06-06
  • 2017-10-01
  • 2014-01-05
  • 2022-01-17
  • 1970-01-01
  • 2019-10-11
  • 2013-12-27
相关资源
最近更新 更多