【问题标题】:Dropping C library on Linux w/GCC在带有 GCC 的 Linux 上删除 C 库
【发布时间】:2021-03-16 22:03:15
【问题描述】:

我正在尝试创建一个只需要大量原始系统调用的基本应用程序,而且我不需要 C 库。我也试图将大小保持在绝对最小值。对于strcpystrcmp 等函数,我希望使用编译器内在函数。

在带有 MSVC/GCC 的 Windows 上,我可以使用 /NODEFAULTLIB-nostdlib 与 C 标准库分离。然后我将简单地链接到kernel32.libuser32.lib,以使用WriteFileCreateWindowExW 等函数。我正在尝试在 linux 上做同样的事情,但我遇到了一些问题。

似乎出于某种原因,系统调用readwriteptrace,process_vm_readv 等的代码实际上在 gclib 中?我尝试使用syscall(SYS_write, ...),并且我希望它会以某种方式内联到我的程序中,但这仍然需要gclib。有没有办法像在 Windows 上那样调用这些系统调用,我会链接到系统库而不是 C 库?我想避免自己使用内联 ASM 编写系统调用存根。我开始使用这样的 linux 编程,所以我不太确定。这是我正在使用的一个简单的测试应用程序(未编译):

#include <unistd.h>

void ProcessEntry()
{
    write(STDOUT_FILENO, "Detached from CRT", 18);
    _exit(0);
}

我正在使用命令:gcc -c program.cld program.o -nostdlib -e ProcessEntry

【问题讨论】:

  • Linux 没有“系统库”之类的东西。如果您不想要 libc,那么您将完全靠自己;除了您自己编写(或导入)的代码外,您无法访问任何代码。特别是,调用系统调用的唯一方法是通过(内联或外联)asm,或者这样做的预先编写的宏或函数。
  • 另一方面,无论您想通过不与 libc 链接来节省什么,我敢打赌这是一种虚假的经济。
  • UNIX 是用 C 编写的,而 C 是发明来编写 UNIX 的。所以 C 库 UNIX 系统库。
  • "I'm also trying to keep size to an absolute minimum" 动态链接到外部库(如 glibc)是最小化可执行文件大小的好方法。

标签: c linux gcc system-calls


【解决方案1】:

这是我得到的:

#include <sys/syscall.h>

// Copied from MUSL libc
// There are more at
// http://git.musl-libc.org/cgit/musl/tree/arch/x86_64/syscall_arch.h
static __inline long __syscall1(long n, long a1) {
  unsigned long ret;
  __asm__ __volatile__("syscall"
                       : "=a"(ret)
                       : "a"(n), "D"(a1)
                       : "rcx", "r11", "memory");
  return ret;
}

void do_exit(int status) { __syscall1(SYS_exit, status); }

void entry() { do_exit(5); }

保存为 syscall.c 并编译

cc -Wall -W -pedantic -static -O3 -march=native -flto -fno-fat-lto-objects  -fPIC -fPIE -fstack-protector-strong -std=gnu18 -nostdlib -e entry  syscall.c   -o syscall

这是 9,224 字节程序的整个反汇编:

0000000000001000 <entry>:
    1000:   f3 0f 1e fa             endbr64
    1004:   b8 3c 00 00 00          mov    $0x3c,%eax
    1009:   bf 05 00 00 00          mov    $0x5,%edi
    100e:   0f 05                   syscall
    1010:   c3                      retq

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 2012-01-29
    • 1970-01-01
    • 2021-04-22
    • 2015-09-21
    • 2012-12-07
    • 2011-04-19
    相关资源
    最近更新 更多