如何使 ld 导出大写符号?
How can I make ld export capitalized symbols?
我正在努力让 gfortran 在 Windows10 上代替 MATLAB 的英特尔 Fortran 编译器。GCC 名称修改风格,至少对于 gfortran,是使符号名称全部小写并附加下划线; "mxIsNumeric800" 变为 mxisnumeric800_。为了让 MATLAB 识别这些符号,它们必须省略附加的下划线(简单,只需将 -fno-underscoring
添加到编译器选项)并且完全由大写字母数字字符组成(困难,但可能)。
我已经能够使用 中描述的方法解决这个大写问题,但我无法让导出的符号保持大写。以下是使用 gfortran 编译的 mex 文件的导出符号(dumpbin /exports timestwo.mexw64
输出的一部分):
ordinal hint RVA name
1 0 00001510 mexfilerequiredapiversion
2 1 000013E0 mexfunction
3 2 000013C0 timestwo
以及使用 Intel Fortran 编译器编译的同一文件:
ordinal hint RVA name
1 0 00001150 MEXFILEREQUIREDAPIVERSION
2 1 00001000 MEXFUNCTION
英特尔编译器通过链接器选项 /EXPORT:FOO
处理导出,该选项使用了两次,一次用于 MEXFUNCTION,一次用于 MEXFILEREQUIREDAPIVERSION。我试过使用包含
的 .def 文件
EXPORTS
MEXFUNCTION
MEXFILEREQUIREDAPIVERSION
但链接它(与带有小写或驼峰符号的 .def 文件相反)不会改变任何内容。我也尝试添加到我的链接描述文件中:
EXTERN(MEXFUNCTION,MEXFILEREQUIREDAPIVERSION);
PROVIDE(mexfunction = MEXFUNCTION);
PROVIDE(mexfilerequiredapiversion = MEXFILEREQUIREDAPIVERSION);
但这并没有改变任何东西。
如何将这些符号修改为大写?
我已经解决了我遇到的具体问题,但解决方案并不令人满意(gfortran 编译的 mex 文件仍然导致 MATLAB 崩溃)。
事实证明,有几种方法可以完成手动符号大写。一个是 BIND(C,NAME="")
,我认为它不起作用但后来发现不是这样。像 subroutine mexfunction(nlhs, plhs, nrhs, prhs) bind(C,name="MEXFUNCTION")
这样的 mex 函数将生成一个可以导出的大写 MEXFUNCTION 符号。
另一种方法是在导出定义 (.def) 文件中为符号添加别名。包含
的文件
EXPORTS
MEXFUNCTION = mexfunction
MEXFILEREQUIREDAPIVERSION = mexfilerequiredapiversion
包含在 运行链接器也将导致导出所需的符号时。这些中的任何一个都是问题的解决方案,即使它不是我要解决的整体问题的解决方案。
使用这两种方法中的任何一种都会导致 mex 函数在 运行 时使 MATLAB 崩溃。当 mex 函数开始时 memcpy
from VCRUNTIME140.dll 运行s 时发生崩溃,导致访问冲突。通过使用调试符号构建 mex 函数,我能够让 MATLAB 输出故障转储。
不幸的是,看起来让 gfortran 与 MATLAB 一起工作不仅仅是链接正确的库和使用正确的符号。
我正在努力让 gfortran 在 Windows10 上代替 MATLAB 的英特尔 Fortran 编译器。GCC 名称修改风格,至少对于 gfortran,是使符号名称全部小写并附加下划线; "mxIsNumeric800" 变为 mxisnumeric800_。为了让 MATLAB 识别这些符号,它们必须省略附加的下划线(简单,只需将 -fno-underscoring
添加到编译器选项)并且完全由大写字母数字字符组成(困难,但可能)。
我已经能够使用 dumpbin /exports timestwo.mexw64
输出的一部分):
ordinal hint RVA name
1 0 00001510 mexfilerequiredapiversion
2 1 000013E0 mexfunction
3 2 000013C0 timestwo
以及使用 Intel Fortran 编译器编译的同一文件:
ordinal hint RVA name
1 0 00001150 MEXFILEREQUIREDAPIVERSION
2 1 00001000 MEXFUNCTION
英特尔编译器通过链接器选项 /EXPORT:FOO
处理导出,该选项使用了两次,一次用于 MEXFUNCTION,一次用于 MEXFILEREQUIREDAPIVERSION。我试过使用包含
EXPORTS
MEXFUNCTION
MEXFILEREQUIREDAPIVERSION
但链接它(与带有小写或驼峰符号的 .def 文件相反)不会改变任何内容。我也尝试添加到我的链接描述文件中:
EXTERN(MEXFUNCTION,MEXFILEREQUIREDAPIVERSION);
PROVIDE(mexfunction = MEXFUNCTION);
PROVIDE(mexfilerequiredapiversion = MEXFILEREQUIREDAPIVERSION);
但这并没有改变任何东西。
如何将这些符号修改为大写?
我已经解决了我遇到的具体问题,但解决方案并不令人满意(gfortran 编译的 mex 文件仍然导致 MATLAB 崩溃)。
事实证明,有几种方法可以完成手动符号大写。一个是 BIND(C,NAME="")
,我认为它不起作用但后来发现不是这样。像 subroutine mexfunction(nlhs, plhs, nrhs, prhs) bind(C,name="MEXFUNCTION")
这样的 mex 函数将生成一个可以导出的大写 MEXFUNCTION 符号。
另一种方法是在导出定义 (.def) 文件中为符号添加别名。包含
的文件EXPORTS
MEXFUNCTION = mexfunction
MEXFILEREQUIREDAPIVERSION = mexfilerequiredapiversion
包含在 运行链接器也将导致导出所需的符号时。这些中的任何一个都是问题的解决方案,即使它不是我要解决的整体问题的解决方案。
使用这两种方法中的任何一种都会导致 mex 函数在 运行 时使 MATLAB 崩溃。当 mex 函数开始时 memcpy
from VCRUNTIME140.dll 运行s 时发生崩溃,导致访问冲突。通过使用调试符号构建 mex 函数,我能够让 MATLAB 输出故障转储。
不幸的是,看起来让 gfortran 与 MATLAB 一起工作不仅仅是链接正确的库和使用正确的符号。