Linker 使用链接器脚本重命名符号

Linker 使用链接器脚本重命名符号,linker,ld,linker-scripts,Linker,Ld,Linker Scripts,是否可以使用链接器脚本或映射文件重命名符号? 我尝试修改一些C++和FORTRAN混合代码,这样它就可以在Linux上使用多个Fortran编译器。它目前是为Solaris Studio编译器编写的,启用了区分大小写选项。我想自动处理Fortran符号名的变化(比如从Makefile) 似乎可以创建别名,因此链接器脚本包含: C_Function_ = c_function; 这将是一种工作。不幸的是,添加-T选项来引用此脚本会导致行为上的其他一些更改,并且由于找不到libdl.so.2/li

是否可以使用链接器脚本或映射文件重命名符号? 我尝试修改一些C++和FORTRAN混合代码,这样它就可以在Linux上使用多个Fortran编译器。它目前是为Solaris Studio编译器编写的,启用了区分大小写选项。我想自动处理Fortran符号名的变化(比如从Makefile)

似乎可以创建别名,因此链接器脚本包含:

C_Function_ = c_function;

这将是一种工作。不幸的是,添加-T选项来引用此脚本会导致行为上的其他一些更改,并且由于找不到libdl.so.2/librt.so.1,我得到了一些错误。是否需要包含某种默认链接器脚本或其他内容?我在Linux上尝试了bfd和gold链接器。

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

PROVIDE(c_function = C_function_);
...
在链接器脚本中

如果使用
-T
选项将此链接器脚本传递到
ld
,它将替换原始(默认)链接器脚本。如果您想让链接器脚本扩展默认值,请在不使用
-T
选项的情况下传递它(就像使用其他对象文件一样)


这样,一切都应该按预期进行

谢谢,省略
-T
可以解决这个问题。
提供了什么功能?这将阻止它在符号被编译到共享库的情况下工作。
PROVIDE()
确保只有在使用的名称不存在时,符号才具有别名。不过,我不知道为什么这会与构建共享库发生冲突。我遇到了这样一种情况:两个库——SystemC和Catch2——都提供了一个main函数,我想重写SystemC main,以便程序条目从Catch2的main开始,并允许我调用SystemC main。有可能使用别名吗?@sheridp:我想说没有。这是另一个值得自己思考的问题