我正试图在Solaris上查找与映射文件链接的故障。当我尝试运行自检时,丢失的映射文件会导致以下错误:
$ ./cryptestcwd v
ld.so.1: cryptestcwd: fatal:
/export/home/cryptopp/.libs/libcryptopp.so.6: hardware capability
(CA_SUNW_HW_1) unsupported: 0x4800000 [ AES SSE4.1 ]
Killed
我已经达到了这个自动制造规则。libcryptopp_la_LINK
,我认为是共享对象,缺少AM_LDFLAGS
。AM_LDFLAGS
持有-M cryptopp.mapfile
选项。
libcryptopp_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS)
$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS)
$(CXXFLAGS) $(libcryptopp_la_LDFLAGS) $(LDFLAGS) -o $@
在configure
运行后,我尝试用sed
进行修补:
libcryptopp_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS)
$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS)
$(CXXFLAGS) $(libcryptopp_la_LDFLAGS) -M cryptopp.mapfile $(LDFLAGS) -o $@
我确认sed
是成功的,但同样的测试再次失败。调用命令时,-M <mapfile>
丢失。
libtool手册讨论了Cygwin上的-M
参数,但不讨论Solaris(讨论仅适用于GCC,而不适用于其他编译器,如IBM XL C/C++、Sun C/C++和LLVM Clang):
请注意,您还需要确保标准Unix目录(如/bin、/lib、/usr/等)出现在驱动器的根目录中。这意味着您必须将Cygwin本身安装到C:\/root目录(或D:/或E:/等)中,而不是建议安装到C:\/Cygwin/中。此外,生成系统中使用的所有文件名都必须是相对的,不应在源目录树或生成目录树中使用符号链接,并且必须避免gcc的除-MMD之外的所有-M*选项。
没有其他提及-M
的内容。
并且没有诊断,如"将-M <mapfile>
选项删除到Sun链接器">或"警告:libtool
不理解选项-M <mapfile>
">。
我的问题是,libtool
是否出于某种原因放弃了-M
及其论点?
Libtool在创建库时确实会删除一些链接选项。手册解释道:
创建共享库时,而不是编译或创建程序中,libtool从提供的命令行中删除一些标志用户。这样做是因为libtool未知的标志可能会干扰创建库或需要libtool的额外支持,以及因为省略标志通常是保守的选择成功构建。
就我个人而言,我觉得这种行为的理由有点傲慢,而且我还认为,当它发生时,libtool
应该发出警告,但除非你想提出反对它的问题,否则这几乎没有意义。
实验表明,CCD_ 17确实是CCD_。特别是,如果我在make
命令行上指定了包含-M
选项的LDFLAGS
,那么当它运行libtool
链接时,我可以观察到它在make
输出中的回声,但在实际执行的链接命令的libtool
的自己的回声中没有:
$make LDFLAGS="-M映射文件";
/bin/sh/libtool--tag=CC--mode=链接gcc-g-O2-M映射文件-o libmylib.la-rpath/usr/local/lib x.lo y.lo
libtool:链接:gcc-shared-fPIC-DPIC.libs/x.o.libs/y.o-O2-Wl,-soname-Wl,libmylib.so.0-o.libs/libmylib.sho.0.0.0
libtool
文档提出了两种解决方案来传递链接选项,否则这些选项将被剥离:
-
对于真正的链接器选项,您可以使用一个或多个
-Wl,
或-Xlinker
选项通过libtool
和链接器驱动程序将您的选项传递给链接器本身。例如,LDFLAGS=-Wl,-M,cryptopp.mapfile
-
对于专门针对链接器驱动程序的选项,文档建议将标志添加到编译器驱动程序命令(CC="gcc-M mapfile")中,但这是无效的,因为
$(CC)
变量由make
展开以形成libtool
命令行,将其中表达的任何选项暴露给libtool
进行剥离。
此外,还有
-XCClinker
选项,通过该选项可以将选项传递到链接器驱动程序(而不是链接器本身),但其行为似乎有点古怪:它似乎忽略了不以连字符开头的选项(例如映射文件的名称)