Linux默认库

时间:2013-12-11 05:12:05

标签: c++

我知道在Windows上,默认情况下会将一些库链接到您的进程,如kernel32.dll等。在Linux上是否有任何等效的库?

我正在创建一些Linux二进制文件并寻找支持例程,尤其是malloc等。在Windows上我只是在HeapAlloc之上实现了malloc()(这也是VS CRT采用的方法)但是我不确定该怎么做出于原因,如果可能的话,我不会在创建二进制文件时链接到libc。

4 个答案:

答案 0 :(得分:2)

默认情况下,Linux中的G ++将链接到C标准库和C ++标准库。偶尔它也会自动引入数学库,虽然历史上你需要用-lm来提问。

在我的Ubuntu框中,我编译并链接了以下简单的“Hello World”应用程序:

#include <iostream>

int main()
{
    std::cout << "Hello world!" << std::endl;
}

我编译如下:g++ hello.cpp

ldd实用程序会列出与此相关联的库g++

$ ldd a.out
linux-vdso.so.1 =>  (0x00007fff1d344000)
libstdc++.so.6 => /usr/local/lib64/libstdc++.so.6 (0x00007fd7fb031000)
libm.so.6 => /lib/libm.so.6 (0x00007fd7fadae000)
libgcc_s.so.1 => /usr/local/lib64/libgcc_s.so.1 (0x00007fd7fab97000)
libc.so.6 => /lib/libc.so.6 (0x00007fd7fa813000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd7fb365000)

第一行linux-vdso.so.1实际上不是库。谷歌,如果你想了解一些神奇的hackery。其余的都很漂亮:

  • libstdc++是C ++标准库
  • libm是上述数学库。我不知道C ++默认是否包含它,但是历史上C编译器没有包含它,除非你在链接时指定了-lm
  • libgcc_s是一个特定于GCC的支持库,包含各种支持例程(即用于奇怪的事物,如古怪的分词,结构副本等)。
  • libc是C标准库。它还包含很多POSIX功能。
  • ld-linux-x86-64是动态库加载器。这实际上是可执行文件

所以,这是套件的默认位。

mallocnewprintf等诸如此类的内容以及完整的C ++标准库(有些人称之为“STL”)。

如果你问默认支持是什么,就是这样。如果您正在尝试实现这些内容的自己版本...... -nodefaultlibs标记将允许您。您可能还需要-ffreestanding,甚至可能需要-fno-builtins

如果你想看看这些部分是如何构建的(包括glibc如何调用mmap和/或sbrk来获取内存以填充malloc堆),你可以下载源代码为glibc看一看。除了直接进行系统调用之外,没有低于glibc的级别可以直接定位。

假设您使用GCC / G ++构建代码,可能需要包含其中一些库,例如libgcc_slibstdc++。如果您不使用标准库函数,并使用libstdc++构建,则可以限制/消除对-ffreestanding的依赖。但是,我会说实话:我只知道旗帜,我从未使用它。

答案 1 :(得分:1)

我认为您需要一些较低级别的API来进行内存管理。那么这个question可能会对你有帮助。

它建议mmap功能。希望它可以帮助你。

答案 2 :(得分:0)

根据ldd以下库在我的ubuntu linux机器上默认链接到g ++ 4.8,用于基本的c ++程序。

linux-vdso.so.1 =>  (0x00007fffe11fe000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f1d1e49b000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f1d1e285000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1d1debc000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1d1dbb8000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1d1e7c7000)

您可以使用-nodefaultlibs开关禁用链接,但您还需要指定以后需要使用相应的开关进行链接。

答案 3 :(得分:0)

在Linux上,glibc相当于Windows库中的很多东西。 POSIX C接口函数,包括C标准库以及内核系统调用包装器都在libc中。它是主要的包装层,提供各种内核版本之间的ABI兼容性。不使用它是非常愚蠢的。

Windows CRT确实具有不同的状态,因为POSIX在Windows上具有不同的状态。 Win32 API在Windows上提供OS界面的地方,它是Linux上的POSIX(包括C stdlib!)。

在Linux上,链接glibc。

您还需要链接一些编译器支持库,无论是LLVM的编译器-rt还是GCC的libgcc。