【问题标题】:GCC: list a statically linked librariesGCC:列出静态链接的库
【发布时间】:2014-12-25 17:52:54
【问题描述】:

这就是问题所在。基本上我的问题是我正在尝试使用选项-fsanitize=address -static-libasan 为 ARM 编译一个应用程序(调试错误指针等很酷)。这可以直接编译为可执行文件,但不适用于从目标文件编译。 Ofc我发现静态库是libasan.a;无论如何,当我试图从一个目标文件中链接所有内容时,它说的是 «pthread» 中的一堆未定义的引用以及一些我什至没有设法找到其 lib-owner 的函数。

所以,我只想用-fsanitize=address -static-libasan 编译一个文件,看看哪些库是静态链接的,这样我以后就可以从一个目标文件中完成。

【问题讨论】:

  • "...它说的是 «pthread» 中的一堆未定义引用..." 尝试将 -pthread 添加到编译器和链接器选项?跨度>
  • @πάνταῥεῖ 当然。
  • 如果在名词前使用“a”,则不能将名词复数。 “一个库”、“一个错误的指针”、“一个目标文件”——所有这些都同样荒谬。
  • @TheParamagneticCroissant 好的。我的拼写还有其他问题吗?
  • 好的,如果有人会因为提到 libasan 而出现在这里,我也会在这里留下一个答案,我最终是如何设法从目标文件静态链接它的。这很重要,但我设法将它与选项 «-Wl,-Bstatic -lasan -Wl,-Bdynamic -lpthread -ldl» 添加到 GCC 的命令行以用于链接时间。

标签: c++ gcc linker ld static-linking


【解决方案1】:

一个可执行文件不存储它从中提取目标文件的任何静态库的踪迹。不过,大多数情况下,这些库是在链接时明确指定的。编译器只引入了几个标准的静态库。对于gcc,您可以看到各种信息,包括使用-v 选项传递给链接器的实际命令行(似乎有些实现希望使用--verbose 和链接器-Wl,--verbose)。此输出应显示所有隐式链接库,例如 -lgcc-lstdc++

请注意,您应该使用特定于语言的前端和与编译时相同的编译器标志进行链接。您的问题描述听起来好像您在编译时使用-pthreadg++,但您尝试使用不带-pthread 标志的gcc 链接(有一些不同的线程相关标志;从描述中无法判断使用了哪一个)。

只是为了处理侮辱,这是在我的计算机上使用 -v 选项时的示例输出:

ThreadGard:stackoverflow kuehl$ cat hello.cpp 
#include <iostream>

int main()
{
  std::cout << "hello, world\n";
  return 0;
}
ThreadGard:stackoverflow kuehl$ g++ -v -static hello.cpp
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/opt/gcc-4.9.2/libexec/gcc/x86_64-apple-darwin13.4.0/4.9.2/lto-wrapper
Target: x86_64-apple-darwin13.4.0
Configured with: ../gcc-4.9.2/configure --prefix=/opt/gcc-4.9.2 --with-gmp=/opt/gcc-infrastructure --with-mpfr=/opt/gcc-infrastructure --enable-decimal-float=bid --enable-lto --enable-languages=c,c++
Thread model: posix
gcc version 4.9.2 (GCC) 
COLLECT_GCC_OPTIONS='-mmacosx-version-min=10.9.4' '-v' '-static' '-mtune=core2'
 /opt/gcc-4.9.2/libexec/gcc/x86_64-apple-darwin13.4.0/4.9.2/cc1plus -quiet -v -D__STATIC__ hello.cpp -quiet -dumpbase hello.cpp -mmacosx-version-min=10.9.4 -mtune=core2 -auxbase hello -version -o /var/folders/b_/64plfvs936v5ylx36qwc8rg00000gp/T//ccrt7fXS.s
GNU C++ (GCC) version 4.9.2 (x86_64-apple-darwin13.4.0)
    compiled by GNU C version 4.9.2, GMP version 5.0.5, MPFR version 3.1.1, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/4.9.2/../../../../x86_64-apple-darwin13.4.0/include"
#include "..." search starts here:
#include <...> search starts here:
 /opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/4.9.2/../../../../include/c++/4.9.2
 /opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/4.9.2/../../../../include/c++/4.9.2/x86_64-apple-darwin13.4.0
 /opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/4.9.2/../../../../include/c++/4.9.2/backward
 /opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/4.9.2/include
 /usr/local/include
 /opt/gcc-4.9.2/include
 /opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/4.9.2/include-fixed
 /usr/include
 /System/Library/Frameworks
 /Library/Frameworks
End of search list.
GNU C++ (GCC) version 4.9.2 (x86_64-apple-darwin13.4.0)
    compiled by GNU C version 4.9.2, GMP version 5.0.5, MPFR version 3.1.1, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: fea0def5b69cf8ae349b2f1faf4b1d23
COLLECT_GCC_OPTIONS='-mmacosx-version-min=10.9.4' '-v' '-static' '-mtune=core2'
 as -arch x86_64 -force_cpusubtype_ALL -static -o /var/folders/b_/64plfvs936v5ylx36qwc8rg00000gp/T//ccPF77oR.o /var/folders/b_/64plfvs936v5ylx36qwc8rg00000gp/T//ccrt7fXS.s
COMPILER_PATH=/opt/gcc-4.9.2/libexec/gcc/x86_64-apple-darwin13.4.0/4.9.2/:/opt/gcc-4.9.2/libexec/gcc/x86_64-apple-darwin13.4.0/4.9.2/:/opt/gcc-4.9.2/libexec/gcc/x86_64-apple-darwin13.4.0/:/opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/4.9.2/:/opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/
LIBRARY_PATH=/opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/4.9.2/:/opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/4.9.2/../../../:/usr/lib/
COLLECT_GCC_OPTIONS='-mmacosx-version-min=10.9.4' '-v' '-static' '-mtune=core2'
 /opt/gcc-4.9.2/libexec/gcc/x86_64-apple-darwin13.4.0/4.9.2/collect2 -static -arch x86_64 -macosx_version_min 10.9.4 -weak_reference_mismatches non-weak -o a.out -lcrt0.o -L/opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/4.9.2 -L/opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/4.9.2/../../.. /var/folders/b_/64plfvs936v5ylx36qwc8rg00000gp/T//ccPF77oR.o /opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/4.9.2/../../../libstdc++.a -no_compact_unwind -no_pie -lgcc_eh -lgcc -v
collect2 version 4.9.2
/usr/bin/ld -static -arch x86_64 -macosx_version_min 10.9.4 -weak_reference_mismatches non-weak -o a.out -lcrt0.o -L/opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/4.9.2 -L/opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/4.9.2/../../.. /var/folders/b_/64plfvs936v5ylx36qwc8rg00000gp/T//ccPF77oR.o /opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/4.9.2/../../../libstdc++.a -no_compact_unwind -no_pie -lgcc_eh -lgcc -v
@(#)PROGRAM:ld  PROJECT:ld64-241.9
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 x86_64h armv6m armv7m armv7em
Library search paths:
    /opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/4.9.2
    /opt/gcc-4.9.2/lib
    /usr/lib
    /usr/local/lib
Framework search paths:
    /Library/Frameworks/
    /System/Library/Frameworks/
ld: library not found for -lcrt0.o
collect2: error: ld returned 1 exit status

没有安装所有静态库来使其实际链接。但是,除了输出清楚地列出了链接器调用之外,还有一点:

/usr/bin/ld -static -arch x86_64 -macosx_version_min 10.9.4 -weak_reference_mismatches non-weak -o a.out -lcrt0.o -L/opt/gcc-4.9.2/lib/gcc/x86_64- apple-darwin13.4.0/4.9.2 -L/opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/4.9.2/../../.. /var/folders/b_ /64plfvs936v5ylx36qwc8rg00000gp/T//ccPF77oR.o /opt/gcc-4.9.2/lib/gcc/x86_64-apple-darwin13.4.0/4.9.2/../../../libstdc++.a -no_compact_unwind -no_pie -lgcc_eh -lgcc -v

(添加了一些重点以使读者更容易阅读 - 这似乎是必要的)

【讨论】:

  • 这根本没有答案。我不想从已编译的二进制文件中获取有关静态库的信息,我只想在编译时显示一个静态链接库的选项。例如。尝试创建一个简单的«helloworld.cpp»,并使用g++ -static-libgcc helloworld.cpp 编译它。你怎么知道静态链接的库是什么? (在示例中显然是libgcc,但在我的问题中这不起作用——我已经找到了libasan,并且仍然有一个库似乎受到-static-libasan 的影响)我>
  • -v 选项的哪一部分我没有准确提及?
  • ? 其实,Dietmar Kühl 你自己试过了吗?我从输出中看不到任何提示,即我之前评论中的一个小示例中的libgcc 是静态链接的。
  • @Hi-Angel:没有必要这样做,因为我知道输出的样子:我经常使用它(使用标准 C++ 库的风险之一只是为了个人娱乐)。请参阅我对问题的更新,如有必要,请在最后引用强调。
  • 嗯……这很有趣……你知道,出于某种原因,我没有从 -v 选项的输出,也没有 somelib.a 的输出,也没有提到 ldthat's what I have跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
相关资源
最近更新 更多