gcc 在链接时忽略符号名称的大小写

Posted

技术标签:

【中文标题】gcc 在链接时忽略符号名称的大小写【英文标题】:gcc ignore casing of symbol names while linking 【发布时间】:2011-01-16 14:45:38 【问题描述】:

我正在开发的软件附带 NETLIB BLAS/LAPACK 嵌入到其源代码中,使用全小写符号名称,但现在在将应用程序移植到 Windows 时,我发现英特尔 MKL 和该平台的其他几个 BLAS/LAPACK 实现使用所有-大写符号名称。有没有办法告诉 gnu 编译器/链接器在匹配符号名称时忽略大小写?

.
.
.
undefined reference to `_dgeqp3'
.
.
.

$ nm /lib/LAPACK.lib | grep -i " T _dgeqp3"
00000000 T _DGEQP3

【问题讨论】:

【参考方案1】:

您看到的差异是由于 Fortran 调用约定:在 Fortran 中,符号大小写并不重要,因此每个编译器都有将 Fortran 符号名称转换为汇编符号名称的方法:GNU 编译器通常将全部转换为小写,英特尔在 Windows 上使用大写。

如果您使用 Fortran 代码,您可以在旧的 g77 编译器上使用 -fsymbol-case-upper 选项(较新的 gfortran 编译器没有此选项)。否则,C 没有简单的答案,除了:

使用#define的 使用 C 接口连接 BLAS 和 LAPACK。

【讨论】:

【参考方案2】:

t.c

#define __CONCAT(x,y) x##y

#ifdef SUFFIX
#define __SUFFIX(x) __CONCAT(x,_)
#else
#define __SUFFIX(x) x
#endif

#ifdef UPPER
#define __c(U,l) __SUFFIX(U)
#else
#define __c(U,l) __SUFFIX(l)
#endif

#define xaxpy __c(XAXPY, xaxpy)

#include <stdio.h>

char* xaxpy;
char* DAXPY;

int main()

    printf(xaxpy);
    printf(DAXPY);

e.c

char* xaxpy  = "ln";
char* xaxpy_ = "ls";
char* XAXPY  = "UN";
char* XAXPY_ = "US";

似乎有一种方法可以在链接时使用--defsym 引入符号别名:

Cetin@BAKA-CHAN ~
$ gcc -D UPPER -D SUFFIX -c t.c e.c

Cetin@BAKA-CHAN ~
$ gcc -o t t.o e.o -Wl,--defsym=_DAXPY=_xaxpy

Cetin@BAKA-CHAN ~
$ ./t
USln
Cetin@BAKA-CHAN ~
$

还必须有一种方法可以为链接器提供不同的脚本来处理大量此类符号定义。所以我可以让它成为构建过程的一部分,以自动创建在不同案例之间创建映射的链接器脚本。

【讨论】:

【参考方案3】:

我想你可能会遇到一些麻烦。 C 规范的第 6.4.2.1 节就标识符说“小写和大写字母是不同的”。这意味着就您的编译器和链接器而言,_DGEQP3_dgeqp3 是不同的符号。您可能可以在特定于平台的标题中添加一些 #define 语句来为您排好队。

是不是因为你链接的是一个 windows 库,而不是你之前使用的任何东西,这个 bug 才出现?

【讨论】:

使用 mingw gfortran 编译 NETLIB BLAS 或 LAPACK 包,正如我们迄今为止所做的那样,会产生类似 dgeqp3 的符号名称(小写,最终下划线)但现在我想在 Windows 上使用其他编译器和库,并且大多数以二进制形式分发的 BLAS LAPACK 实现都有符号名称,如 _DGEQP3(大写,没有最后的下划线),有些甚至有 _dgeqp3(小写,没有最后的下划线)。我们已经有 #define 语句来覆盖最后的下划线,如果我找不到解决这个区分大小写问题的方法,我想我们将不得不相应地增加它们。 @Cetin,有时这就是 cookie 崩溃的方式。祝你好运!

以上是关于gcc 在链接时忽略符号名称的大小写的主要内容,如果未能解决你的问题,请参考以下文章

JS中自定义replace可替换特殊符号$等,但无法忽略大小写的函数

Linux忽略大小写查找技巧

Liunx常用操作-如何忽略大小写查找

如何在命令行中使 gcc 链接器输出节大小?

GCC - 在没有链接描述文件的情况下获取自定义部分的大小

jQuery 忽略属性/数据名称中的大小写?