大佬教程收集整理的这篇文章主要介绍了在带有 GCC 的 Linux 上删除 C 库,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试创建一个基本的应用程序,它只对原始系统调用很重要,我不需要 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
。
这是我得到的:
#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
以上是大佬教程为你收集整理的在带有 GCC 的 Linux 上删除 C 库全部内容,希望文章能够帮你解决在带有 GCC 的 Linux 上删除 C 库所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。