libtool是否使用-M剥离所有选项



我正试图在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_LDFLAGSAM_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=&quot-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选项,通过该选项可以将选项传递到链接器驱动程序(而不是链接器本身),但其行为似乎有点古怪:它似乎忽略了不以连字符开头的选项(例如映射文件的名称)

相关内容

  • 没有找到相关文章

最新更新