我想在没有(g)libc的情况下编译我的C代码.如何停用它以及哪些功能依赖于它?
我尝试了-nostdlib但它没有帮助:代码是可编译的并运行,但我仍然可以在我的可执行文件的hexdump中找到libc的名称.
GCC和Clang等编译器允许在没有C++标准库的情况下编译C++程序,例如使用-nostdlib命令行标志.似乎这种情况经常无法与您联系,例如:
void f() noexcept { throw 42; }
int main() { f(); }
Run Code Online (Sandbox Code Playgroud)
通常无法链接由于像未定义的符号__cxa_allocate_exception,typeinfo for int,__cxa_throw,__gxx_personality_v0,__clang_call_terminate,__cxa_begin_catch,std::terminate()等.
即使是简单的
int main() {}
Run Code Online (Sandbox Code Playgroud)
无法链接
ld:警告:找不到输入符号
_start; 默认为0000000000400120
并在执行时被操作系统杀死.使用-c编译器仍会运行显式失败的链接器:
LD:错误
mytest(.eh_frame); 不会.eh_frame_hdr创建任何表.
在不使用和链接到标准库的情况下编程和编译C++应用程序或库是否是一个现实的目标?如何在Linux上使用GCC或Clang编译我的代码?没有标准库,哪些核心语言功能无法使用?
我有以下简单程序:
#define N 20
long c[N];
long a[N + N];
void f(void)
{
long *s = c;
long *p = a;
while (p != a + N) *p++ = *s++;
while (p != a + N + N) *p++ = 0;
}
Run Code Online (Sandbox Code Playgroud)
我用它编译:
/usr/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gcc -mthumb -O3 -o main.o -c main.c
Run Code Online (Sandbox Code Playgroud)
gcc方便地用memcpy和memset分别替换循环:
00000000 <f>:
0: b570 push {r4, r5, r6, lr}
2: 4d07 ldr r5, [pc, #28] ; (20 <f+0x20>)
4: 4c07 ldr r4, [pc, #28] ; …Run Code Online (Sandbox Code Playgroud)