加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

LINUX:是否可以编写一个不依赖于libc库的工作程序?

发布时间:2020-12-13 19:14:59 所属栏目:Linux 来源:网络整理
导读:我想知道我是否可以使用可执行的C编程语言编写程序,尽管不使用单个库调用,例如甚至没有退出()? 如果是这样,它显然不会依赖于库(libc,ld-linux). 解决方法 我怀疑你可以编写这样的东西,但最后需要有一个无限循环,因为你不能要求操作系统退出你的进程.你做不
我想知道我是否可以使用可执行的C编程语言编写程序,尽管不使用单个库调用,例如甚至没有退出()?

如果是这样,它显然不会依赖于库(libc,ld-linux).

解决方法

我怀疑你可以编写这样的东西,但最后需要有一个无限循环,因为你不能要求操作系统退出你的进程.你做不了什么有用的东西.

首先编译一个ELF程序,查看ELF规范并将程序段,程序段和程序所需的其他部分组合在一起.内核会加载你的代码并跳转到一些初始地址.你可以在那里放置无限循环.但是不知道一些汇编程序,无论如何从一开始就没有希望.

glibc使用的start.S文件可能有用作起点.尝试更改它,以便您可以从中组装独立的可执行文件.那个start.S文件是所有ELF应用程序的入口点,并且是调用__libc_start_main的文件,后者又调用main.您只需更改它以满足您的需求.

好的,这是理论上的.但现在,它有什么实际用途?

回答更新的问题

好.有一个名为libgloss的库,它为那些打算在嵌入式系统上运行的程序提供了一个最小的接口. newlib C库使用该库作为其系统调用接口.一般的想法是libgloss是C库和操作系统之间的层.因此,它还包含操作系统跳转到的启动文件.这两个库都是GNU binutils项目的一部分.我已经用它们为另一个操作系统和另一个处理器做了接口,但似乎没有Linux的libgloss端口,所以如果你打电话给系统调用,你必须自己做,就像其他人已经说过的那样.

用C编程语言编写程序是绝对可能的. linux内核就是这样一个程序的一个很好的例子.但也可以使用用户程序.但最低要求的是运行时库(如果你想做任何严肃的事情).这样的包含真正的基本功能,如memcpy,基本宏等. C标准具有一种称为独立的特殊一致性模式,它只需要一组非常有限的功能,也适用于内核.实际上,我对x86汇编程序一无所知,但我试过一个非常简单的C程序:

/* gcc -nostdlib start.c */
int main(int,char**,char**);

void _start(int args)
{
    /* we do not care about arguments for main. start.S in 
     * glibc documents how the kernel passes them though.
     */
    int c = main(0,0);

    /* do the system-call for exit. */
    asm("movl   %0,%%ebxn" /* first argument */
        "movl   $1,%%eaxn" /* syscall 1 */
        "int    $0x80"      /* fire interrupt */
        : : "r"(c) :"%eax","%ebx");
}

int main(int argc,char** argv,char** env) {
    /* yeah here we can do some stuff */
    return 42;
}

我们很开心,它实际上编译并运行:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读