Linux应用程序的装载和执行

  在研究c文件的编译/装载/运行之前,先了解ELF文件的概念,ELF(Executable and Linking Format)是一种对象文件的格式。ELF文件格式是UNIX系统实验室作为应用程序二进制接口而开发发布的,是Linux的主要可执行文件格式。

  简单来说,ELF是“编译器/连接器”和“内核/CPU”之前的二进制接口,一种固定下来的文件格式。编译链接器将C程序编译为对应体系结构下的机器可执行文件,而这种文件和CPU以及内核按照ELF格式来约定,比如代码段/数据段/bss段就是在ELF文件中写明。内核在加载时,读取按照ELF文件格式读取各段内容到物理内存上,建立好自己的内存映射表,准备好进程环境,将各段的内存地址写入CPU寄存器上,然后调度开始,我们的程序就占据了CPU,CPU按照流水线一句接着一句的执行我们编译出来代码段的指令。

  于是,一句“hello world”想要在arm和x86上执行,内核和编译器在其中起了什么作用么?

  arm-linux-gcc hello.c -o hello_arm

  使用arm的gcc编译工具链,生成arm下的可执行文件hello_arm。使用file命令查看hello_arm文件的属性,看到hello_arm就是arm的ELF文件。

  在bash上执行./hello_arm,内核将hello_arm中的数据段/代码段/bss段等加载到物理内存上,并为hello_arm建立好进程环境,将CPU的数据段寄存器/代码段寄存器/堆栈段寄存器值写为实际的物理内存地址,然后将控制权交给ARM CPU,由arm的CPU开始执行我们的可执行文件。

  对比到x86上,唯一变化的是要使用x86的编译器就C代码编译成X86机器指令组成的可执行文件,然后交由x86内核加载,由x86 CPU执行。

时间: 2024-12-08 18:56:12

Linux应用程序的装载和执行的相关文章

Linux应用程序调用其他程序执行

一.system 1.作用 在Linux应用程序中调用另一个程序: 2.用法 system("/sbin/ifconfig"): 二.popen 1.作用 调用另一个程序执行,同时保存执行的结果: 2.使用示例 #include <stdio.h> int main() { FILE *pf; char buffer[4096]; pf = popen("/sbin/ifconfig", "r"); fread(buffer, siz

Shell脚本执行hive语句 | hive以日期建立分区表 | linux schedule程序

#!/bin/bash source /etc/profile; ################################################## # Author: ouyangyewei # # # # Content: Combineorder Algorithm # ################################################## # change workspace to here cd / cd /home/deploy/rec

Linux 任务计划,周期性任务执行

Linux 任务计划.周期性任务执行 概述: 什么是任务计划呢?就像我们每个人日常生活中都会使用到的闹钟一样,按时的去提醒该去做什么事情,以免忘记.同样,我们在工作当中也要在每天在特定的时间内安排做一些事情,这就是任务计划,本章将学习如何制定Linux系统的任务计划,这里主要包括两种工具:at和crontab. 一.定义 1.任务计划的分类:      一次性的任务计划:只执行一次就结束:      周期性的任务计划:每隔一定的时期去做相同的事情:2.使用的命令      未来时间点执行一次某任

Linux服务器程序规范

除了网络通信外,服务器程序还必须考虑许多其他细节问题,零碎,但基本上时模板式的. ---引 Linux服务器程序一般以后台形式运行.后台程序又称守护进程.它没有控制终端,因而也不会意外接受用户输入.守护进程的父进程一般是init进程(pid=1). Linux服务器程序通常有一套日志系统,它至少能输出日志到文件,有的高级服务器可以输出日志到专门的UDP服务器.大部分后台进程都在/var/log下有自己的日志目录. Linux服务器程序一般以某个专门的非root身份运行.mysqld, httpd

Linux C程序异常退出怎么办——core文件帮你忙

想必你一定遇到过Linux下程序异常退出的问题,异常退出貌似有一种神奇的魔力,会让你神经突然紧张.不要怕,Linux是很强大的,在程序退出的时候,会在可执行文件所在的目录生成一个core文件,它很好地记录了一些神秘而又必要的东西,帮助你定位到错误的根源,想想以前面试的时候人家闻到core文件,我答不上来,你说面试官会怎样想,那么就来说说core文件. core文件实际上就是一个内存映象同时加上一些调试信息. 首先,你得打开系统的core文件生成开关吧,终端中输入ulimit -c命令,若显示0表

使用RPM包工具和源码包编译安装Linux应用程序

系统命令:一般在/bin和/sbin目录中,或为Shell内部指令,完成对系统的基本管理工作,例如IP配置工具 应用程序:通常在/usr/bin和/usr/sbin目录中,完成相对独立的其他辅助任务,例如网页浏览器 Linux应用程序的组成 /usr/bin     普通可执行程序文件,普通用户即可执行 /usr/sbin    服务器程序.管理程序文件,只有管理员能执行 /etc         配置文件,文件较多时会创建子目录 /var/log     日志文件 /usr/share/doc

Linux C程序的编译

Linux C程序的编译过程 学习一门语言程序,本人觉得还是得学习它的编译规则,现在,通过小例子小结下自己对C编译的认识. /*test.c     了解C程序的编译*/ #include <stdio.h>int main(void){ printf("Hello World!\n"); return 0;} 对于test.c,我们常用一步编译到位的命令是: gcc -o test test.c  或者  gcc test.c -o test 实际上,上面的这个编译命令包

配置开发支持高并发TCP连接的Linux应用程序全攻略

http://blog.chinaunix.net/uid-20733992-id-3447120.html http://blog.chinaunix.net/space.php?uid=16480950&do=blog&id=103598 原文见:http://www.cppblog.com/flashboy/articles/47012.html1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到

VELT-0.1.5开发:在vs2013下调试Linux GUI程序

VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发.利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行uboot和linux内核的编译,并根据编译时的错误信息正确定位到源码.目前的版本是0.1.4,仅支持vs2013.此插件可以在CSDN下载频道下载(http://download.csdn.net/detail/lights