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

Johannes Sch..

7

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

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

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

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

回答更新的问题

好.有一个名为的库libgloss提供了一个最小的接口,用于在嵌入式系统上运行的程序.在newlibC库使用了一个作为其系统调用接口.一般的想法是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,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;

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值