LINUX:是否可以编写不依赖于libc库工作计划? [英] LINUX: Is it possible to write a working program that does not rely on the libc library?

查看:146
本文介绍了LINUX:是否可以编写不依赖于libc库工作计划?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不知道是否我可以写在 C -programming语言是可执行的,尽管不使用单个库调用,例如程序即使不退出()?

I wonder if I could write a program in the C-programming language that is executable, albeit not using a single library call, e.g. not even exit()?

如果是这样,它显然不会在所有依赖库(libc的,LD-Linux的)。

If so, it obviously wouldn't depend on libraries (libc, ld-linux) at all.

推荐答案

我怀疑你可以写这样的东西,但它需要有在最后一个死循环,因为你不能要求操作系统退出你的过程。而你不能做任何有用的东西。

I suspect you could write such a thing, but it would need to have an endless loop at the end, because you can't ask the operation system to exit your process. And you couldn't do anything useful.

好开始编译一个ELF程序,窥视ELF规范和工艺在一起你需要一个程序头,程序段和其他部分。内核会加载code,并跳转到一些初始地址。你可以把有无限循环。但不知道一些汇编,这是从反正一开始无望。

Well start with compiling an ELF program, look into the ELF spec and craft together the header, the program segments and the other parts you need for a program. The kernel would load your code and jump to some initial address. You could place an endless loop there. But without knowing some assembler, that's hopeless from the start on anyway.

< 13759的glibc code> start.S中 文件可能为起点有益的。试图改变它,这样就可以组建一个独立的可执行文件出来。这start.S中的文件是所有ELF应用程序的入口点,并且是调用一个 __ libc_start_main 这反过来又来电。你只需要改变它,所以它适合您的需要。

The start.S file as used by glibc may be useful as a start point. Try to change it so that you can assemble a stand-alone executable out of it. That start.S file is the entry point of all ELF applications, and is the one that calls __libc_start_main which in turn calls main. You just change it so it fits your needs.

好吧,这是理论上的。但现在,这是否有什么实际用途?

Ok, that was theoretical. But now, what practical use does that have?

嘛。有一个名为 libgloss 库,为那些是为了在嵌入式系统上运行的程序的最小接口。在 newlib C库将使用它作为其系统调用接口。总的想法是,libgloss是C库和操作系统之间的层。因此,它也包含该操作系统跳转到启动文件。这两个库是GNU binutils的项目的一部分。我用它们做的另一个操作系统和另一个处理器的接口,但似乎并没有成为用于Linux的libgloss端口,因此,如果调用系统调用,你必须做你自己,正如其他人已经说过

Well. There is a library called libgloss that provides a minimal interface for programs that are meant to run on embedded systems. The newlib C library uses that one as its system-call interface. The general idea is that libgloss is the layer between the C library and the operation system. As such, it also contains the startup files that the operation system jumps into. Both these libraries are part of the GNU binutils project. I've used them to do the interface for another OS and another processor, but there does not seem to be a libgloss port for Linux, so if you call system calls, you will have to do it on your own, as others already stated.

这是绝对有可能写在C编程语言编写的程序。在 linux内核的是这样一个程序的一个很好的例子。而且也方便用户的方案是可能的。但什么是最低限度需要的是一个运行时库(如果你想做任何严肃的事情)。这样的人会真的包含基本功能,如memcpy的,基本的宏等。的C标准具有所谓的独立的一个特殊的一致性方式,它仅需要一个非常有限的功能性,也适合内核。实际上,我已经的不知道的有关x86汇编,但我已经尽我的运气非常简单的C程序:

It is absolutely possible to write programs in the C programming language. The linux kernel is a good example of such a program. But also user programs are possible. But what is minimally required is a runtime library (if you want to do any serious stuff). Such one would contain really basic functions, like memcpy, basic macros and so on. The C Standard has a special conformance mode called freestanding, which requires only a very limited set of functionality, suitable also for kernels. Actually, i have no clue about x86 assembler, but i've tried my luck for a very simple C program:

/* 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,0);

    /* do the system-call for exit. */
    asm("movl   %0,%%ebx\n" /* first argument */
        "movl   $1,%%eax\n" /* 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;
}

我们很高兴,但实际上编译和运行:)

We're happy, it actually compiles and runs :)

这篇关于LINUX:是否可以编写不依赖于libc库工作计划?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆