我知道在Windows上,默认情况下会将一些库链接到您的进程,如kernel32.dll等。在Linux上是否有任何等效的库?
我正在创建一些Linux二进制文件并寻找支持例程,尤其是malloc等。在Windows上我只是在HeapAlloc之上实现了malloc()(这也是VS CRT采用的方法)但是我不确定该怎么做出于原因,如果可能的话,我不会在创建二进制文件时链接到libc。
答案 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
是动态库加载器。这实际上是可执行文件。所以,这是套件的默认位。
malloc
,new
,printf
等诸如此类的内容以及完整的C ++标准库(有些人称之为“STL”)。
如果你问默认支持是什么,就是这样。如果您正在尝试实现这些内容的自己版本...... -nodefaultlibs
标记将允许您。您可能还需要-ffreestanding
,甚至可能需要-fno-builtins
。
如果你想看看这些部分是如何构建的(包括glibc如何调用mmap
和/或sbrk
来获取内存以填充malloc
堆),你可以下载源代码为glibc看一看。除了直接进行系统调用之外,没有低于glibc
的级别可以直接定位。
假设您使用GCC / G ++构建代码,可能需要包含其中一些库,例如libgcc_s
和libstdc++
。如果您不使用标准库函数,并使用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。