【问题标题】:Partially Linked Vxworks Image Project (VIP)部分链接的 Vxworks 映像项目 (VIP)
【发布时间】:2019-06-20 18:52:01
【问题描述】:

我从事的产品是由我的 VIP 项目引用的几个 DKM 项目构成的。

不过,有一个“未知”函数实现,稍后将在初始化阶段加载。

为了加载它:
1.我声明了一个函数指针(funcPtr)。
2. 在我打电话给LoadModule() aka 之后。 ld()
3.调用symFind()获取新加载符号的地址 4.分配funcPtr的地址。

我对这个解决方案有疑问,因为我的发布版本中不能有符号表。
它被视为敏感的组织数据,但没有它我无法使用symFind()

以下任何问题都可以缓解或解决我的问题,因此我将不胜感激:)

  • 调用loadModule(myModule.o)时,myModule中是否有函数在加载后立即被调用?

  • 我可以编译一个缺少 extern 符号的 VIP 项目,就像在 linux 中一样。 稍后当我将 ld() 用于我的模块时将重新定位?

  • 我可以限制符号表来分配符号表,除了我需要的几个符号,如何?

【问题讨论】:

    标签: linker symbols ld debug-symbols vxworks


    【解决方案1】:

    不久前我遇到了同样的问题。我已经实现了如下动态链接工具(在 VxWorks 6.8 上),假设存在签名为 void* callMeDynamic() 的函数:

    1. 使用loadModule() 加载所需的目标文件。

    2. 获取函数的地址。

    我找不到实现这一步的简单方法。我找到了以下解决方法。

    2.1。如Using a VxWorks Pipe中所述,创建管道并转移标准输出

    2.2。调用lkup(callMeDynamic) 并使用所述管道保存输出。

    2.3。解析 lkup 转储的输出,得到你的入口函数的地址。

    1. 将获得的地址转换并分配给合适的函数指针
    2. 根据需要调用函数

    希望这会有所帮助。

    【讨论】:

    • 我虽然关于模块之间的通信,但没有找到加载的模块何时获得执行时间以便发布相关地址(如您在第 2.1 节中提到的)。在 Windows 中,有 DLLMain 函数在加载 DLL 时被调用...
    【解决方案2】:

    回答我的问题:

    • 调用loadModule(myModule.o)时,myModule中是否有函数在加载后立即被调用?
      答案:没用。

    • 我可以编译一个缺少外部符号的 VIP 项目,就像在 linux 中一样。稍后当我为我的模块使用 ld() 时将重新定位?
      答案:不,VIP 是完全链接的,不能有未定义的符号。
      您可以拥有指向函数的指针,并在它们可用时为其分配地址。

    • 我可以限制 Symbol-Table 以分配 sym-tbl,除了我需要的几个符号,如何?
      答案:是的,我使用了 stripppc -K <symbol_to_keep> ... 命令 in make-file 来实现这一点。

    【讨论】:

      猜你喜欢
      • 2018-01-09
      • 2012-03-27
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      相关资源
      最近更新 更多