相关疑难解决方法(0)

没有libc编译

我想在没有(g)libc的情况下编译我的C代码.如何停用它以及哪些功能依赖于它?

我尝试了-nostdlib但它没有帮助:代码是可编译的并运行,但我仍然可以在我的可执行文件的hexdump中找到libc的名称.

c gcc glibc libc demo

53
推荐指数
2
解决办法
3万
查看次数

Barebones C++没有标准库?

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编译我的代码?没有标准库,哪些核心语言功能无法使用?

c++ std

15
推荐指数
2
解决办法
4150
查看次数

gcc用memcpy和memset替换循环

我有以下简单程序:

#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方便地用memcpymemset分别替换循环:

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)

c gcc arm

5
推荐指数
2
解决办法
912
查看次数

标签 统计

c ×2

gcc ×2

arm ×1

c++ ×1

demo ×1

glibc ×1

libc ×1

std ×1