Linker 如何使用--使用libtool的整个归档

Linker 如何使用--使用libtool的整个归档,linker,g++,static-libraries,libtool,Linker,G++,Static Libraries,Libtool,如何在不重新排序的情况下使用libtool的整个归档文件 背景: 我从依赖于Dyninst的源代码编译extre(performanceprofiling),Dyninst依赖于libdwarf,而Debian Wheezy则作为一个静态库(usr/lib/libdwarf.a)提供 Dyninst由以下来源编译: # ./configure --with-libdwarf-static; make; make install 创建: /usr/lib/libdynDwarf.so.8.1

如何在不重新排序的情况下使用libtool的整个归档文件

背景: 我从依赖于Dyninst的源代码编译extre(performanceprofiling),Dyninst依赖于libdwarf,而Debian Wheezy则作为一个静态库(usr/lib/libdwarf.a)提供

Dyninst由以下来源编译:

 # ./configure --with-libdwarf-static; make; make install
创建:

/usr/lib/libdynDwarf.so.8.1
/usr/lib/libdyninstAPI.so.8
然后从中编译Extrae

导致此错误的原因是libdynDwarf需要链接静态库时未包含的符号。为此提供了一种解决方案,以取代:

 -ldwarf
与:

我将此更改为:

./src/launcher/dyninst/Makefile.am
然后再次进行配置和制作。我得到这个输出:

/bin/sh ../../../libtool --tag=CXX   --mode=link g++ -I../../../src/common -I/usr/include  -g -O2 -Wall -W -L/usr/lib64 -ldyninstAPI -L/usr/lib64 -lunwind -lparseAPI -lsymtabAPI -linstructionAPI   -lcommon -L/usr/lib -Wl,--whole-archive -ldwarf -Wl,--no-whole-archive  -lelf -L/usr/lib -lxml2  -o extrae extrae-extrae.o extrae-forkSnippets.o extrae-cudaSnippets.o extrae-ompSnippets.o extrae-apiSnippets.o extrae-mpiSnippets.o extrae-commonSnippets.o extrae-applicationType.o extrae-mini-xml-parse.o
libtool: link: g++ -I../../../src/common -I/usr/include -g -O2 -Wall -W -Wl,--whole-archive -Wl,--no-whole-archive -o extrae extrae-extrae.o extrae-forkSnippets.o extrae-cudaSnippets.o extrae-ompSnippets.o extrae-apiSnippets.o extrae-mpiSnippets.o extrae-commonSnippets.o extrae-applicationType.o extrae-mini-xml-parse.o  -L/usr/lib64 -ldyninstAPI -lunwind -lparseAPI -lsymtabAPI -linstructionAPI -lcommon -L/usr/lib -ldwarf -lelf -lxml2
/usr/lib/libdynDwarf.so.8.1: undefined reference to `dwarf_elf_init'
/usr/lib/libdynDwarf.so.8.1: undefined reference to `dwarf_finish'
请注意,libtool将liking排序转换为(-ldwarf不再由--whole archive包装):

如果我手动运行以下两个重新排序的命令,编译将成功,我可以重新运行make并继续成功

g++ -I../../../src/common -I/usr/include -g -O2 -Wall -W -o load-module load_module-load-module.o  -L/usr/lib64 -ldyninstAPI -lunwind -lparseAPI -lsymtabAPI -linstructionAPI -lcommon -L/usr/lib -Wl,--whole-archive -ldwarf -Wl,--no-whole-archive -lelf -lxml2
g++ -I../../../src/common -I/usr/include -g -O2 -Wall -W -o demo-launcher demo_launcher-demo-launcher.o  -L/usr/lib64 -ldyninstAPI -lunwind -lparseAPI -lsymtabAPI -linstructionAPI -lcommon -L/usr/lib -Wl,--whole-archive -ldwarf -Wl,--no-whole-archive -lelf -lxml2
问题

  • 如何停止libtool重新排序标志?
  • 有更好的解决方案吗?
参考:Makefile.am的狙击手:

...
bin_PROGRAMS = extrae
...

extrae_SOURCES = extrae.C, ...
...
extrae_CXXFLAGS = -I$(COMMON_DIR) 
extrae_CFLAGS = -I$(COMMON_DIR) -I@DYNINST_INCLUDES@ @XML2_CFLAGS@
extrae_LDFLAGS =  @DYNINST_LDFLAGS@ -ldyninstAPI @UNWIND_LDFLAGS@ @UNWIND_LIBS@ -lparseAPI -lsymtabAPI -linstructionAPI $(DYNINST_EXTRA_LIBS) -lcommon @DWARF_LDFLAGS@ -ldwarf @ELF_LDFLAGS@ -lelf @XML2_LDFLAGS@ @XML2_LIBS@
我遇到了同样的问题。tl;灾难恢复使用
-Wl,-整个存档,-ldwarf,-没有整个存档
 g++ ... -Wall -W -Wl,--whole-archive -Wl,--no-whole-archive -o extrae ... -ldyninstAPI ... -ldwarf ...
g++ -I../../../src/common -I/usr/include -g -O2 -Wall -W -o load-module load_module-load-module.o  -L/usr/lib64 -ldyninstAPI -lunwind -lparseAPI -lsymtabAPI -linstructionAPI -lcommon -L/usr/lib -Wl,--whole-archive -ldwarf -Wl,--no-whole-archive -lelf -lxml2
g++ -I../../../src/common -I/usr/include -g -O2 -Wall -W -o demo-launcher demo_launcher-demo-launcher.o  -L/usr/lib64 -ldyninstAPI -lunwind -lparseAPI -lsymtabAPI -linstructionAPI -lcommon -L/usr/lib -Wl,--whole-archive -ldwarf -Wl,--no-whole-archive -lelf -lxml2
...
bin_PROGRAMS = extrae
...

extrae_SOURCES = extrae.C, ...
...
extrae_CXXFLAGS = -I$(COMMON_DIR) 
extrae_CFLAGS = -I$(COMMON_DIR) -I@DYNINST_INCLUDES@ @XML2_CFLAGS@
extrae_LDFLAGS =  @DYNINST_LDFLAGS@ -ldyninstAPI @UNWIND_LDFLAGS@ @UNWIND_LIBS@ -lparseAPI -lsymtabAPI -linstructionAPI $(DYNINST_EXTRA_LIBS) -lcommon @DWARF_LDFLAGS@ -ldwarf @ELF_LDFLAGS@ -lelf @XML2_LDFLAGS@ @XML2_LIBS@