【问题标题】:rename a symbol using a linker script使用链接描述文件重命名符号
【发布时间】:2017-06-15 11:57:13
【问题描述】:

是否可以使用链接描述文件或映射文件来重命名符号? 我正在尝试调整一些用 C++ 和 Fortran 混合编写的代码,以便它可以在 Linux 上与多个 Fortran 编译器一起使用。它目前是为 Solaris Studio 编译器编写的,并且启用了区分大小写的选项。我想自动处理 Fortran 符号名称修饰的变化(例如来自 Makefile)。

似乎确实可以创建别名,所以链接描述文件包含:

C_Function_ = c_function;

会有点工作。不幸的是,添加 -T 选项来引用此脚本会导致行为发生其他一些变化,并且由于找不到 libdl.so.2/librt.so.1 而出现错误。是否有某种我需要包含的默认链接器脚本或其他东西?我已经在 Linux 上尝试了 bfd 和 gold 链接器。

【问题讨论】:

    标签: linker ld linker-scripts


    【解决方案1】:

    您不能真正重命名符号,但您可以为现有符号定义别名,例如

    PROVIDE(c_function = C_function_);
    ...
    

    在链接描述文件中。

    如果您将此链接脚本与-T 选项一起传递给ld,它将替换原始(默认)链接脚本。如果您希望将链接器脚本 extend 设为默认值,请在不使用 -T 选项的情况下传递它(就像使用附加目标文件一样)。

    这样,一切都应该按预期工作。

    【讨论】:

    • 谢谢,省略-T 解决了这个问题。 PROVIDE 有什么作用?这会阻止它在符号被编译到共享库中的情况下工作。
    • PROVIDE() 确保符号仅在使用的名称不存在时才使用别名。不过,不知道为什么这会与构建共享库发生冲突。
    • 我有一个情况,两个库——SystemC 和 Catch2——都提供一个主函数,我想覆盖 SystemC 主函数,以便程序入口从 Catch2 的主函数开始并允许我调用 SystemC 主程序。是否可以为此使用别名?
    • @sheridp:我会说不。这是另一个值得自问的问题
    猜你喜欢
    • 2012-12-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    • 2013-06-03
    • 1970-01-01
    • 2012-04-06
    相关资源
    最近更新 更多