【问题标题】:How to find 64-bit divisions in existing C code?如何在现有 C 代码中找到 64 位除法?
【发布时间】:2019-12-10 02:53:47
【问题描述】:

有人知道在现有代码库中查找 64 位分区的方法吗?可能通过引入 64 位除法的编译错误或警告。 (gcc 或 clang)?

背景是我想用自定义函数替换所述代码库中的所有 64 位分区,例如 a/b 将替换为 my64_div(a, b);。为了更容易将代码移植到 ARM 32 位平台。 我想我可以为 ARM 32 交叉编译它并查看编译错误。有没有办法在没有交叉编译的情况下做到这一点?

可能是一个带有 cparser 库的 python 脚本,可以找到 64 位除法?我之前曾将 PyCLibrary 用于不同的任务,但我看不到为此目的使用它的方法。 任何提示表示赞赏。

编辑: 多一点背景为什么我需要这个。这里涉及 3 个团队。

  1. 研究团队:他们编写代码时不太关心 64 位除法。

  2. 我的团队:我们将研究库集成到我们的代码中。我们制作最终产品。以源代码形式提供。

  3. 客户:我们的一些客户会将此代码移植到 ARM 32 位内核。他们想用自己优化的功能来代替 64 位分区。

团队 1. 和 2. 主要使用 64 位 PC 来编译代码。在这个阶段找到 64 位分区会很棒,因为它们很昂贵,我们正试图避免它们。因此,在夜间构建期间标记它们会很棒。 其次,我们希望让客户的生活更轻松。这意味着如果我们用自定义函数替换所有 64 位除法,它们只需要用另一个函数替换函数。其余的源代码可以保持不变。

交叉编译和检测__udivdi3当然是一种可能,也可能是唯一的选择。但我希望那里可能有另一种解决方案。

【问题讨论】:

  • 没有。您必须手动浏览代码库。
  • 这就是我目前正在做的事情,但工作量很大:)
  • 在不支持 64 位除法的系统上;编译器很可能会注入对执行 64 位除法的库函数(例如 __udivdi3())的调用,以便软件仍然可以工作。您可以使用自己的函数查找/替换库函数,而不是替换原始源代码中的 64 位分区。
  • @Brendan 或者你甚至可以自己实现它。

标签: c gcc llvm-clang


【解决方案1】:

我将在这里解决 XY 问题:您不需要这样做。 64 位除法是 C 语言的一部分,存在于任何有效的 C 编译器中。通常在没有本机指令的目标上(注意:许多甚至没有用于 32 位的指令!)它通常作为对编译器提供的库的库调用来实现。

如果您确实想找到它们,请使用 nm 实用程序从目标文件(例如 grep 其输出)中查找对这些库函数的引用,或使用 objdump -dr 来查看哪个函数参考来自。由 GCC 发起的典型命名约定是 __udivdi3 等,但在 ARM 上可能会使用由 EABI 定义的不同名称(与 __aeabi_.*div.* 之类的模式匹配的名称)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2011-05-03
    • 2012-04-06
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 2014-07-31
    相关资源
    最近更新 更多