我知道在Windows上,默认情况下你会得到一些库链接到你的进程中-比如kernel32.dll等等。Linux上有没有类似的库?
我正在创建一些Linux二进制文件,并寻找支持例程,特别是malloc等。在Windows上,我只是在HeapAlloc (这也是VS采用的方法)上实现了malloc(),但我不确定在这里要做什么。出于某些原因,在创建二进制文件时,如果可能的话,我不会链接到libc。
发布于 2013-12-11 13:25:55
默认情况下,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实际上不是一个库。如果你想了解一些神奇的黑客行为,可以在谷歌上搜索一下。其余的都很平淡无奇:
libstdc++是C++标准,librarylibm是前面提到的数学库。我不知道C++在默认情况下是否包含它,但在历史上C编译器不包含它,除非您在链接中指定-lm time.libgcc_s是一个特定于GCC的支持库,包含各种支持例程(即.对于奇怪的东西,比如奇怪的除法,结构副本,etc.)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++。如果您不使用标准库函数,而使用-ffreestanding构建,那么您可能能够限制/消除对libstdc++的依赖。但是,老实说:我只知道旗帜,我从来没有用过它。
发布于 2013-12-11 13:18:38
我认为你需要一些低级的API来进行内存管理。那么这个question可能会对你有所帮助。
建议使用mmap函数。希望能对你有所帮助。
发布于 2013-12-11 13:25:13
根据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开关链接它们,但您还需要指定稍后需要使用适当的开关链接它们。
https://stackoverflow.com/questions/20511019
复制相似问题