【发布时间】:2021-03-16 22:03:15
【问题描述】:
我正在尝试创建一个只需要大量原始系统调用的基本应用程序,而且我不需要 C 库。我也试图将大小保持在绝对最小值。对于strcpy、strcmp 等函数,我希望使用编译器内在函数。
在带有 MSVC/GCC 的 Windows 上,我可以使用 /NODEFAULTLIB 或 -nostdlib 与 C 标准库分离。然后我将简单地链接到kernel32.lib、user32.lib,以使用WriteFile、CreateWindowExW 等函数。我正在尝试在 linux 上做同样的事情,但我遇到了一些问题。
似乎出于某种原因,系统调用read、write、ptrace,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.c 和 ld 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