程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在带有 GCC 的 Linux 上删除 C 库大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决在带有 GCC 的 Linux 上删除 C 库?

开发过程中遇到在带有 GCC 的 Linux 上删除 C 库的问题如何解决?下面主要结合日常开发的经验,给出你关于在带有 GCC 的 Linux 上删除 C 库的解决方法建议,希望对你解决在带有 GCC 的 Linux 上删除 C 库有所启发或帮助;

我正在尝试创建一个基本的应用程序,它只对原始系统调用很重要,我不需要 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

解决方法

这是我得到的:

#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,请注明来意。