当前位置:首页 » 操作系统 » linuxas汇编

linuxas汇编

发布时间: 2023-04-23 10:30:21

linux内核编译出错。

你的编译环境有问题。

as 提示不支持某个参数,而且从上面看你应该在编译 arm 架构的内核,但后面的提示是 as 命令,这种名字的命令(没有架构前缀)应该是本地编译器。我想你不太可能在 arm 上本地编译内核吧(实际上确实可以,而且我以前玩 arm 也都倾向于 arm 上本地编译,就是速度慢,需要用 distcc 加速,但兼容好)?
貌似是 -EL 参数 ix86 架构不支持。所以不太可能这步就是应该用本地 as 编译。
如果不是 arm 本地编译,那有可能这步用错了 as 这个汇编器命令。你的台式计算机 as 是 x86 或者 amd64 的,肯定不支持 arm 特有的编译参数和代码。

你看看你的编译文章吧。可能有错,不符合现在内核编译的规范了。或者 GCC 版本太老或者太新不支持这个参数。不排除你的交叉编译环境有问题。

别听那匿名胡扯的,内核源代码根本没有 configure 。

㈡ “干货”嵌入式Linux系统移植的四大步骤(上)


在学习系统移植的相关知识,在学习和调试过程中,发现了很多问题,也解决了很多问题,但总是对于我们的开发结果有一种莫名其妙的感觉,纠其原因,主要对于我们的开发环境没有一个深刻的认识,有时候几个简单的命令就可以完成非常复杂的功能,可是我们有没有想过,为什么会有这样的效果?


如果没有去追问,只是机械地完成,并且看到实验效果,这样做其实并没有真正的掌握系统移植的本质。


在做每一个步骤的时候, 首先问问自己,为什么要这样做,然后再问问自己正在做什么? 搞明白这几个问题,我觉得就差不多了,以后不管更换什么平台,什么芯片,什么开发环境,你都不会迷糊,很快就会上手。对于嵌入式的学习方法,我个人方法就是:从宏观上把握(解决为什么的问题),微观上研究(解决正在做什么的问题),下面以自己学习的arm-cortex_a8开发板为目标,介绍下自己的学习方法和经验。


嵌入式Linux系统移植主要由四大部分组成:


一、搭建交叉开发环境
二、bootloader的选择和移植
三、kernel的配置、编译、和移植
四、根文件系统的制作


第一部分:搭建交叉开发环境


先介绍第一分部的内容:搭建交叉开发环境,首先必须得思考两个问题,什么是交叉环境? 为什么需要搭建交叉环境?


先回答第一个问题,在嵌入式开发中,交叉开发是很重要的一个概念,开发的第一个环节就是搭建环境,第一步不能完成,后面的步骤从无谈起,这里所说的交叉开发环境主要指的是:在开发主机上(通常是我的pc机)开发出能够在目标机(通常是我们的开发板)上运行的程序。嵌入式比较特殊的是不能在目标机上开发程序(狭义上来说),因为对于一个原始的开发板,在没有任何程序的情况下它根本都跑不起来,为了让它能够跑起来,我们还必须要借助pc机进行烧录程序等相关工作,开发板才能跑起来,这里的pc机就是我们说的开发主机,想想如果没有开发主机,我们的目标机基本上就是无法开发,这也就是电子行业的一句名言:搞电子,说白了,就是玩电脑!


然后回答第二个问题,为什么需要交叉开发环境?主要原因有以下几点:


原因 1: 嵌入式系统的硬件资源有很多限制,比如cpu主频相对较低,内存容量较小等,想想让几百MHZ主频的MCU去编译一个Linux kernel会让我们等的不耐烦,相对来说,pc机的速度更快,硬件资源更加丰富,因此利用pc机进行开发会提高开发效率。


原因2: 嵌入式系统MCU体系结构和指令集不同,因此需要安装交叉编译工具进行编译,这样编译的目标程序才能够在相应的平台上比如:ARM、MIPS、 POWEPC上正常运行。


交叉开发环境的硬件组成主要由以下几大部分


1.开发主机
2.目标机(开发板)
3.二者的链接介质,常用的主要有3种方式:(1)串口线 (2)USB线 (3)网线


对应的硬件介质,还必须要有相应的软件“介质”支持:


1.对于串口,通常用的有串口调试助手,putty工具等,工具很多,功能都差不多,会用一两款就可以;


2.对于USB线,当然必须要有USB的驱动才可以,一般芯片公司会提供,比如对于三星的芯片,USB下载主要由DNW软件来完成;


3.对于网线,则必须要有网络协议支持才可以, 常用的服务主要两个


第一:tftp服务:

主要用于实现文件的下载,比如开发调试的过程中,主要用tftp把要测试的bootloader、kernel和文件系统直接下载到内存中运行,而不需要预先烧录到Flash芯片中,一方面,在测试的过程中,往往需要频繁的下载,如果每次把这些要测试的文件都烧录到Flash中然后再运行也可以,但是缺点是:过程比较麻烦,而且Flash的擦写次数是有限的;另外一方面:测试的目的就是把这些目标文件加载到内存中直接运行就可以了,而tftp就刚好能够实现这样的功能,因此,更没有必要把这些文件都烧录到Flash中去。


第二: nfs服务:

主要用于实现网络文件的挂载,实际上是实现网络文件的共享,在开发的过程中,通常在系统移植的最后一步会制作文件系统,那么这是可以把制作好的文件系统放置在我们开发主机PC的相应位置,开发板通过nfs服务进行挂载,从而测试我们制作的文件系统是否正确,在整个过程中并不需要把文件系统烧录到Flash中去,而且挂载是自动进行挂载的,bootload启动后,kernel运行起来后会根据我们设置的启动参数进行自动挂载,因此,对于开发测试来讲,这种方式非常的方便,能够提高开发效率。


另外,还有一个名字叫 samba 的服务也比较重要,主要用于文件的共享,这里说的共享和nfs的文件共享不是同一个概念,nfs的共享是实现网络文件的共享,而samba实现的是开发主机上 Windows主机和Linux虚拟机之间的文件共享,是一种跨平台的文件共享 ,方便的实现文件的传输。


以上这几种开发的工具在嵌入式开发中是必备的工具,对于嵌入式开发的效率提高做出了伟大的贡献,因此,要对这几个工具熟练使用,这样你的开发效率会提高很多。等测试完成以后,就会把相应的目标文件烧录到Flash中去,也就是等发布产品的时候才做的事情,因此对于开发人员来说,所有的工作永远是测试。


通过前面的工作,我们已经准备好了交叉开发环境的硬件部分和一部分软件,最后还缺少交叉编译器,读者可能会有疑问,为什么要用交叉编译器?前面已经讲过,交叉开发环境必然会用到交叉编译工具,通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,开发主机PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统。相对于交叉编译,平常做的编译叫本地编译,也就是在当前平台编译,编译得到的程序也是在本地执行。用来编译这种跨平台程序的编译器就叫交叉编译器,相对来说,用来做本地编译的工具就叫本地编译器。所以要生成在目标机上运行的程序,必须要用交叉编译工具链来完成。

这里又有一个问题,不就是一个交叉编译工具吗?为什么又叫交叉工具链呢?原因很简单,程序不能光编译一下就可以运行,还得进行汇编和链接等过程,同时还需要进行调试,对于一个很大工程,还需要进行工程管理等等,所以,这里 说的交叉编译工具是一个由 编译器、连接器和解释器 组成的综合开发环境,交叉编译工具链主要由binutils(主要包括汇编程序as和链接程序ld)、gcc(为GNU系统提供C编译器)和glibc(一些基本的C函数和其他函数的定义) 3个部分组成。有时为了减小libc库的大小,也可以用别的 c 库来代替 glibc,例如 uClibc、dietlibc 和 newlib。

那么,如何得到一个交叉工具链呢?是从网上下载一个“程序”然后安装就可以使用了吗?回答这个问题之前先思考这样一个问题,我们的交叉工具链顾名思义就是在PC机上编译出能够在我们目标开发平台比如ARM上运行的程序,这里就又有一个问题了,我们的ARM处理器型号非常多,难道有专门针对我们某一款的交叉工具链吗?若果有的话,可以想一想,这么多处理器平台,每个平台专门定制一个交叉工具链放在网络上,然后供大家去下载,想想可能需要找很久才能找到适合你的编译器,显然这种做法不太合理,且浪费资源!因此,要得到一个交叉工具链,就像我们移植一个Linux内核一样,我们只关心我们需要的东西,编译我们需要的东西在我们的平台上运行,不需要的东西我们不选择不编译,所以,交叉工具链的制作方法和系统移植有着很多相似的地方,也就是说,交叉开发工具是一个支持很多平台的工具集的集合(类似于Linux源码),然后我们只需从这些工具集中找出跟我们平台相关的工具就行了,那么如何才能找到跟我们的平台相关的工具,这就是涉及到一个如何制作交叉工具链的问题了。


通常构建交叉工具链有如下三种方法:


方法一 : 分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。该方法相对比较困难,适合想深入学习构建交叉工具链的读者。如果只是想使用交叉工具链,建议使用下列的方法二构建交叉工具链。


方法二: 通过Crosstool-ng脚本工具来实现一次编译,生成交叉编译工具链,该方法相对于方法一要简单许多,并且出错的机会也非常少,建议大多数情况下使用该方法构建交叉编译工具链。


方法三 : 直接通过网上下载已经制作好的交叉编译工具链。该方法的优点不用多说,当然是简单省事,但与此同时该方法有一定的弊端就是局限性太大,因为毕竟是别人构建好的,也就是固定的,没有灵活性,所以构建所用的库以及编译器的版本也许并不适合你要编译的程序,同时也许会在使用时出现许多莫名其妙的错误,建议读者慎用此方法。

crosstool-ng是一个脚本工具,可以制作出适合不同平台的交叉编译工具链,在进行制作之前要安装一下软件:
$ sudo apt-get install g++ libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk
crosstool脚本工具可以在http://ymorin.is-a-geek.org/projects/crosstool下载到本地,然后解压,接下来就是进行安装配置了,这个配置优点类似内核的配置。主要的过程有以下几点:
1. 设定源码包路径和交叉编译器的安装路径
2. 修改交叉编译器针对的构架

3. 增加编译时的并行进程数,以增加运行效率,加快编译,因为这个编译会比较慢。
4. 关闭JAVA编译器 ,减少编译时间
5. 编译
6. 添加环境变量
7. 刷新环境变量。
8. 测试交叉工具链

到此,嵌入式Linux系统移植四大部分的第一部分工作全部完成,接下来可以进行后续的开发了。



第二部分:bootloader的选择和移植


01 Boot Loader 概念


就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境,他就是所谓的引导加载程序(Boot Loader)。


02 为什么系统移植之前要先移植BootLoader?


BootLoader的任务是引导操作系统,所谓引导操作系统,就是启动内核,让内核运行就是把内核加载到内存RAM中去运行,那先问两个问题:第一个问题,是谁把内核搬到内存中去运行?第二个问题:我们说的内存是SDRAM,大家都知道,这种内存和SRAM不同,最大的不同就是SRAM只要系统上电就可以运行,而SDRAM需要软件进行初始化才能运行,那么在把内核搬运到内存运行之前必须要先初始化内存吧,那么内存是由谁来初始化的呢?其实这两件事情都是由bootloader来干的,目的是为内核的运行准备好软硬件环境,没有bootloadr我们的系统当然不能跑起来。

03 bootloader的分类


首先更正一个错误的说法,很多人说bootloader就是U-boot,这种说法是错误的,确切来说是u-boot是bootloader的一种。也就是说bootloader具有很多种类,


由上图可以看出,不同的bootloader具有不同的使用范围,其中最令人瞩目的就是有一个叫U-Boot的bootloader,是一个通用的引导程序,而且同时支持X86、ARM和PowerPC等多种处理器架构。U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目,是由德国DENX小组开发的用于多种嵌入式CPU的bootloader程序,对于Linux的开发,德国的u-boot做出了巨大的贡献,而且是开源的。

u-boot具有以下特点:

① 开放源码;
② 支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;
③ 支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale;
④ 较高的可靠性和稳定性;
⑤ 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;
⑥ 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;
⑦ 较为丰富的开发调试文档与强大的网络技术支持;
其实,把u-boot可以理解为是一个小型的操作系统。

04 u-boot的目录结构


* board 目标板相关文件,主要包含SDRAM、FLASH驱动;
* common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;
* cpu 与处理器相关的文件。如mpc8xx子目录下含串口、网口、LCD驱动及中断初始化等文件;
* driver 通用设备驱动,如CFI FLASH驱动(目前对INTEL FLASH支持较好)
* doc U-Boot的说明文档;
* examples可在U-Boot下运行的示例程序;如hello_world.c,timer.c;
* include U-Boot头文件;尤其configs子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件;
* lib_xxx 处理器体系相关的文件,如lib_ppc, lib_arm目录分别包含与PowerPC、ARM体系结构相关的文件;
* net 与网络功能相关的文件目录,如bootp,nfs,tftp;
* post 上电自检文件目录。尚有待于进一步完善;
* rtc RTC驱动程序;
* tools 用于创建U-Boot S-RECORD和BIN镜像文件的工具;

05 u-boot的工作模式


U-Boot的工作模式有 启动加载模式和下载模式 。启动加载模式是Bootloader的正常工作模式,嵌入式产品发布时,Bootloader必须工作在这种模式下,Bootloader将嵌入式操作系统从FLASH中加载到SDRAM中运行,整个过程是自动的。 下载模式 就是Bootloader通过某些通信手段将内核映像或根文件系统映像等从PC机中下载到目标板的SDRAM中运行,用户可以利用Bootloader提供的一些令接口来完成自己想要的操作,这种模式主要用于测试和开发。

06 u-boot的启动过程


大多数BootLoader都分为stage1和stage2两大部分,U-boot也不例外。依赖于cpu体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。


1、 stage1(start.s代码结构)
U-boot的stage1代码通常放在start.s文件中,它用汇编语言写成,其主要代码部分如下:
(1) 定义入口。由于一个可执行的image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在rom(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。
(2)设置异常向量(exception vector)。
(3)设置CPU的速度、时钟频率及中断控制寄存器。
(4)初始化内存控制器 。
(5)将rom中的程序复制到ram中。
(6)初始化堆栈 。
(7)转到ram中执行,该工作可使用指令ldrpc来完成。


2、 stage2(C语言代码部分)

lib_arm/board.c中的start armboot是C语言开始的函数,也是整个启动代码中C语言的主函数,同时还是整个u-boot(armboot)的主函数,该函数主要完成如下操作:
(1)调用一系列的初始化函数。
(2)初始化flash设备。
(3)初始化系统内存分配函数。
(4)如果目标系统拥有nand设备,则初始化nand设备。
(5)如果目标系统有显示设备,则初始化该类设备。
(6)初始化相关网络设备,填写ip,c地址等。
(7)进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。

07 基于cortex-a8的s5pc100bootloader启动过程分析


s5pc100支持两种启动方式,分别为USB启动方式和NandFlash启动方式:


1. S5PC100 USB启动过程

[1] A8 reset, 执行iROM中的程序
[2] iROM中的程序根据S5PC100的配置管脚(SW1开关4,拨到4对面),判断从哪里启动(USB)
[3] iROM中的程序会初始化USB,然后等待PC机下载程序
[4] 利用DNW程序,从PC机下载SDRAM的初始化程序到iRAM中运行,初始化SDRAM
[5] SDRAM初始化完毕,iROM中的程序继续接管A8, 然后等待PC下载程序(BootLoader)
[6] PC利用DNW下载BootLoader到SDRAM
[7] 在SDRAM中运行BootLoader

2. S5PC100 Nandflash启动过程

[1] A8 reset, 执行IROM中的程序
[2] iROM中的程序根据S5PC100的配置管脚(SW1开关4,拨到靠4那边),判断从哪里启动(Nandflash)
[3] iROM中的程序驱动Nandflash
[4] iROM中的程序会拷贝Nandflash前16k到iRAM
[5] 前16k的程序(BootLoader前半部分)初始化SDRAM,然后拷贝完整的BootLoader到SDRAM并运行
[6] BootLoader拷贝内核到SDRAM,并运行它
[7] 内核运行起来后,挂载rootfs,并且运行系统初始化脚本

08 u-boot移植(基于cortex_a8的s5pc100为例)


1.建立自己的平台

(1).下载源码包2010.03版本,比较稳定
(2).解压后添加我们自己的平台信息,以smdkc100为参考版,移植自己s5pc100的开发板
(3).修改相应目录的文件名,和相应目录的Makefile,指定交叉工具链。
(4).编译
(5).针对我们的平台进行相应的移植,主要包括修改SDRAM的运行地址,从0x20000000
(6).“开关”相应的宏定义
(7).添加Nand和网卡的驱动代码
(8).优化go命令
(9).重新编译 make distclean(彻底删除中间文件和配置文件) make s5pc100_config(配置我们的开发板) make(编译出我们的u-boot.bin镜像文件)
(10).设置环境变量,即启动参数,把编译好的u-boot下载到内存中运行,过程如下:
1. 配置开发板网络
ip地址配置:
$setenv ipaddr 192.168.0.6 配置ip地址到内存的环境变量
$saveenv 保存环境变量的值到nandflash的参数区

网络测试:
在开发开发板上ping虚拟机:
$ ping 192.168.0.157(虚拟机的ip地址)

如果网络测试失败,从下面几个方面检查网络:
1. 网线连接好
2. 开发板和虚拟机的ip地址是否配置在同一个网段
3. 虚拟机网络一定要采用桥接(VM--Setting-->option)
4. 连接开发板时,虚拟机需要设置成 静态ip地址

2. 在开发板上,配置tftp服务器(虚拟机)的ip地址
$setenv serverip 192.168.0.157(虚拟机的ip地址)
$saveenv
3. 拷贝u-boot.bin到/tftpboot(虚拟机上的目录)
4. 通过tftp下载u-boot.bin到开发板内存
$ tftp 20008000(内存地址即可) u-boot.bin(要下载的文件名)

如果上面的命令无法正常下载:
1. serverip配置是否正确
2. tftp服务启动失败,重启tftp服务
#sudo service tftpd-hpa restart

5. 烧写u-boot.bin到nandflash的0地址
$nand erase 0(起始地址) 40000(大小) 擦出nandflash 0 - 256k的区域
$nand write 20008000((缓存u-boot.bin的内存地址) 0(nandflash上u-boot的位置) 40000(烧写大小)

6. 切换开发板的启动方式到nandflash
1. 关闭开发板
2. 把SW1的开关4拨到4的那边
3. 启动开发板,它就从nandflash启动

㈢ Linux下有没有类似DOS下的debug.exe程序

有,gdb的x命令,用法:x addr。
详情参考书籍《Debugging With GDB》“Examing Memory”章节。
此外linux下可铅贺以用第三槐世派方的as,as86,nasm等工返笑具,都提供汇编功能

㈣ linux 系统下as命令是什么意思 怎么用

as命令是gcc套件中的汇编器,它采用的是AT/T的汇编语法,和windows下的MASM不太一样

㈤ C语言工作原理

作为一种编程语言,本身是谈不上工作原理的,实际上C语言所有的语法,正是C语言编译器的工作原理或者工作机制的具体实现。要细致的讨论起来是不可能,但是作为C语言程序员,必须了解这个大致的流程。一个程序,从C语言源码,到系统可执行的文件,一般经历四个过程。
1、预处理阶断,这个阶断是文本处理阶断,有预处理器来完成,会将源码中的带"#"开头的预处理命令进行相应的处理,在Linux上C语言的预处理器程序是cp命令。
2、编译阶断,这个阶断是有C语言编译阶断,在Linux上C语言的编译器是cc命令,它将C语言源码转换成汇编指令。
3、汇编阶断,这个阶断是汇编编译阶断,在Linux上C语言的汇编器是as命令,这个阶断会将汇编指令编译成二进制机器码。
4、链接阶断,这个阶断是会将汇编阶断生成的机器码目标文件,装载成一个系统可执行的文件,在Linux平台以ELF格式进行组装,在Windows平台上以PE格式进行组装。在Linux平台上的链接器命令为ld,在windows平台上的链接器命令为linker。

㈥ linux Makefile问题.S.s: $(CPP) $(CFLAGS) $< -o $*.s什么意思

请慢慢看,真要详细讲起来,文字实在太多了,但是由于时间原因,我只能以粗略的文字讲,语言有一些逻辑漏洞,请见谅。

首先我会以粗略的文字回答你的其中一个问题,然后后面会给出第二个问题的答案。
问:什么时候会执行这些规则及其相对应的命令?
答:当你给make命令指定了它要生成的终极目标时,它会从要生成的终极目标寻址依赖的依赖条件,然后依赖条件一级一级的查找并执行相对应的命令。即如果当有目标需要.s、.o这些依赖条件的时候,会取找要生成.s、.o目标的依赖条件,这个时候就会执行这些规则:
.S.s:
$(CPP) $(CFLAGS) $< -o $*.s
.S.o:
$(CC) $(CFLAGS) -c $< -o $*.o
.c.o:
$(CC) $(CFLAGS) -c $< -o $*.o

一、
源代码文件必须经过:预处理(cpp)、编译(ccl)、汇编(as)、链接(ld)。这四个阶段最终才得到可执行的程序:
makefile里定义了变量CPP=cpp;其中$(CPP)的意思是去定义变量CPP里的值:cpp,用cpp来预处理源文件。
$(CFLAGS)的意思是取定义变量CDLAGS里面的值,一般是一些自我定义的预处理命令和编译命令的参数。
$<的意思是:在规则的命令中,表示第一个依赖条件
-o是一个预处理、编译等执行命令需要的参数
/*
其实这条命令:$(CPP) $(CFLAGS) $< -o $*.s,就是一条预处理命令,将一个源文件预处理为.s文件后缀的文件,*为通配符。那源文件在哪里呢。其实这条命令.S.s: 已经说了以.S结尾的文件就是源文件。那这条命令.S.s这么说了呢?请看下面的后缀规则讲解。
*/

二、
老式风格的"后缀规则"
后缀规则是一个比较老式的定义隐含规则的方法。后缀规则会被模式规则逐步地取代。因为模式规则更强更清晰。为了和老版本的Makefile兼容,GNU make同样兼容于这些东西。后缀规则有两种方式:"双后缀"和"单后缀"。

双后缀规则定义了一对后缀:目标文件的后缀和依赖目标(源文件)的后缀。如".c.o"相当于"%o : %c"。单后缀规则只定义一个后缀,也就是源文件的后缀。

后缀规则中所定义的后缀应该是make所认识的,如果一个后缀是make所认识的,那么这个规则就是单后缀规则,而如果两个连在一起的后缀都被make所认识,那就是双后缀规则。例如:".c"和".o"都是make所知道。
因而,如果你定义了一个规则是".c.o"那么其就是双后缀规则,意义就是".c" 是源文件的后缀,".o"是目标文件的后缀。如下示例:
.c.o:
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<

其中.c.o:这个命令表示源文件的后缀为.c,目标文件的后缀为.o;即也可理解为:生成.o的目标文件依赖条件是源文件.c
下面命令是将是所有的.c源文件都编译成.o的目标文件。
注:后缀规则不允许任何的依赖文件,如果有依赖文件的话,那就不是后缀规则,那些后缀统统被认为是文件名,
如:
.c.o: foo.h
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<

这个例子,就是说,文件".c.o"依赖于文件"foo.h",而不是我们想要的这样:

%.o: %.c foo.h
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
因此后缀规则不允许任何的依赖文件。

㈦ Linux系统中的redhat的常用输入命令有哪些

redhat linux的命令
一. 启动,关机,登入,登出相关命令
<login> 登录
<logout> 登出
<exit> 登出
<shutdown> 停止系统
<halt> 停止系统
<reboot> 重启动
<poweroff> 切断电源
<sync> 把内存里的内容写入磁盘
<lilo> 安装lilo启动管理程序
<grub> 安装lilo启动管理程序

二. Shell相关命令
<chsh> 切换Shell
<history> 显示命令履历
<alias> 设置命令别名
<unalias> 取消命令别名
<which> 显示命令所在位置
<type> 查询命令种类
<echo> 显示字符串或者变量内容
<set> 设置/显示Shell变量
<printenv> 显示环境变量
<export> 设置环境变量
<env> 设置临时环境变量
<unset> 释放环境变量
<setenv> 设置环境变量
<unsetenv> 释放环境变量
<source> 执行文件当中的命令
<man> 查询命令手册
<info> 查询超文本命令手册
<whatis> 显示命令简介
<apropos> 通过关键字查询手册

三. 用户管理相关命令
<su> 切换到其他用户
<useradd> 追加用户
<adser> 追加用户
<userdel> 删除用户
<usermod> 修改用户设置
<chfn> 修改用户私人信息
<groupadd> 追加组
<groupdel> 删除组
<groupmod> 修改组设置
<passwd> 更改密码
<whoami> 显示用户名
<logname> 显示登录用户帐号
<users> 显示所有登录用户信息
<who> 查询登录用户信息
<w> 查询登录用户信息
<id> 显示指定用户的ID信息
<groups> 显示指定用户的所属组
<finger> 显示指定用户的个人信息
<mesg> 开关与他人收发消息
<write> 给其他用户发消息
<wall> 给所有用户发消息
<talk> 和其他用户聊天

四. 系统消息相关命令
<date> 显示/设置当前时间
<uptime> 显示系统运行时间
<arch> 显示机器的核心构架(如i386)
<uname> 显示操作系统信息
<tty> 显示终端名
<last> 显示登录/登出在履历
<lastb> 显示非法登录信息
<mpkeys> 显示当前键盘配置
<loadkeys> 变更键盘配置
<df> 查询磁盘使用信息
<> 查询磁盘使用信息
<dmesg> 显示系统启动消息
<script> 保存输入输出到文件

五. 文件操作相关命令
<ls> 显示文件列表
<tree> 显示目录树
<pwd> 显示当前路径
<cd> 更改当前路径
<pushd> 追加路径到目录堆栈
<popd> 从目录堆栈删除路径
<dirs> 显示目录堆栈的内容
<mkdir> 创建路径
<rmdir> 删除路径
<cp> 复制文件/目录
<rm> 删除文件/目录
<mv> 移动文件/目录,修改文件名
<chown> 更改文件/目录的所有者
<chgrp> 修改文件/目录的所有组
<chmod> 修改文件/目录的权限
<touch> 更改文件时间
<ln> 建立文件/目录链接
<find> 查找文件
<whereis> 显示文件存在的路径名
<file> 查询文件种类
<size> 查询文件大小

六. 文件编辑相关命令
<cat> 显示文件内容
<tee> 输出到文件和屏幕
<more> 分屏显示文件内容
<less> 分屏显示文件内容
<head> 显示文件头部内容
<tail> 显示文件尾部内容
<fold> 折叠显示长行
<sort> 排列文件的行
<cmp> 比较文件内容
<diff> 显示文件差异
<nkf> 更改日语文件编码
<dd> 变更文件之后复制
<wc> 统计文本单词数,文件大小等
<split> 分割文件
<paste> 以行连接文件
<join> 以字段连接文件
<grep> 查询文字
<uniq> 过滤重复部分显示文件内容
<tr> 替换文字
<sed> 替换文字

七. 压缩/解压缩相关命令
<ar> 压缩/解压缩文件
<tar> 压缩/解压缩文件
<compress> 压缩/解压缩文件
<uncompress> 解压缩
<gzip> 压缩/解压缩文件
<gunzip> 解压缩
<zcat> 显示压缩文件的内容
<lha> 压缩/解压缩文件
<uuencode> 把二进制文件编码为文本文件
<uudecode> 把经过编码的文本文件还原为二进制文件

八. MS-DOS工具集[mtools]命令
<mdir> 显示文件列表
<mcd> 改变当前目录
<mmd> 新建目录
<mrd> 删除目录
<mdeltree> 删除目录树
<m> 复制文件
<mdel> 删除文件
<mmove> 移动文件
<mren> 更改文件或目录名
<mattrib> 修改文件属性
<mtype> 显示文件内容
<m> 查询文件或目录大小
<minfo> 显示磁盘信息
<mformat> 以MS-DOS方式格式化磁盘
<mlabel> 设置磁盘标签

九. 控制外部设备相关命令
<mount> mount上设备
<umount> 解除已经mount上的设备
<eject> 弹出(CD/DVD等)
<fdformat> 格式化软盘
<fdisk> 配置/显示硬盘分区
<mkfs> 格式化磁盘分区
<fsck> 检查/修复磁盘错误
<lpr> 打印到打印机
<lprm> 中断打印任务
<lpq> 显示打印任务的状态
<lpc> 管理/控制打印任务
<ifconfig> 显示/设定NIC配置

十. 进程及任务管理相关命令
<ps> 显示正在运行的进程
<jobs> 显示后台运行任务
<fg> 把任务切换到前台
<bg> 把任务切换到后台
<kill> 中止进程或任务
<killall> 中止进程或任务
<wait> 等待进程或任务的结束
<at> 设置定时执行任务
<atq> 显示尚未执行的任务
<atrm> 删除定时执行任务
<batch> 在系统负荷减轻的时候执行任务
<nice> 改变优先度并执行任务
<nohup> 在后台执行任务,Logout之后也不退出
<sleep> 休眠一定的时间

十一. 网络管理相关命令
<netstat> 显示当前网络连接状况
<route> 显示/设置路由
<host> 显示网络主机情况
<hostname> 显示/设置当前主机的名字
<ping> 确认和远程机器的连接情况
<traceroute> 显示路由信息
<rwho> 查询网上机器的登陆用户
<ruptime> 查询网上机器的系统运行时间
<rlogin> 登陆到远程机器
<telnet> 用telnet登陆到远程机器
<rsh> 给远程机器发送命令
<rcp> 在远程机器之间复制文件
<mail> 收取邮件
<sendmail> 发送邮件
<mailq> 确认邮件队列
<ftp> 用ftp传输文件

十二. 其他命令
<cal> 显示日历
<clear> 清屏
<gcc> 编译C语言代码
<as> 汇编
<bc> 计算
<rpm> Redhat的包管理
<dpkg> Debian的包管理
<installpkg> Slackware的包安装(删除命令则是removepkg)
<XF86Setup,turboxfg,Xconfigurator> 配置 X 服务器
<startx> 启动 X-Window 系统
附:组合命令
重定向,如
$ ls -l /bin > ls-output
$ more ls-output
管道命令,如
$ cat file1 file2 | sort | uniq
经常被用于管道的命令
awk, fold, grep, head, nnkf, pr, sed, sort, tail, tee, tr, uniq, wc
很多了

㈧ arm-linux-gcc怎么编译自己写的头文件

linux gcc编译c文件头文件
linux gcc编译c文件头文件,使用GCC编译器编译C语言

凶猪下山
转载
关注
0点赞·1047人阅读
GCC编译C源代码有四个步骤:预处理—->编译—->汇编—->链接。

可以利用GCC的参数来控制执行的过程,这样就可以更深入的了解编译C程序的裤晌过程。

下面将通过对一个程序的编译来演示整个过程。

#include

int main()

{

printf("happy new year!\n");

return 0;

}

1:预处理:编译前纯李器将C程序的头文件编译进来,还有宏的替换,可以用gcc的参数-E来参看。

预处理 命令:gcc -E hello.c -o hello.i

作用:将hello.c预处理输出hello.i

2:编译:这个阶段编译器主要做词法分析、语法分析、语义分析等,在检查无错误后后,把代码翻译成汇编语言。可用gcc的参数-S来参看。

编译器(ccl)将文本文件hello.i 翻译成文本文件hello.s, 它包含一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式描述了一条低级机器语言指令。

编译命令:gcc -S hello.i -o hello.s

作用:将预处理输出文件hello.i汇编成hello.s文件

3:汇编:把编译阶段生成的.s 文件转换为二进制目标代码。可用gcc的参数-c来参看。汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成可重定位目标程序的格式, 并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件,它的字节编码是机器语言。

汇编 命令:gcc -c hello.s -o hello.o

作用:作用:将汇编输出文件hello.s编译输出hello.o文件

4:链接:把obj文件链接为可执行的文件:链接器(ld)负责.o文件的并入。结果就是hello文件,它是一个课执行的目标文件,可以加载到存储器后由系统调用。

链接命令:gcc hello.o -o hello

一步操作的话是: (-o必须在hello之前 )

$gcc hello.c -o hello

$./hello或者:(会默认生成a.out文件)

$gcc hello.c

$./慧迟a.out

㈨ 怎样通俗地理解Linux(Debian)中软件包互相之间的依赖

不管是初步跨入Linux殿堂的新手,还是具有多年经验的专家,在安装或编译软件包的过程中或多或少的都会遇到包的依赖问题,从而导致安装过程无法继续,比如管理员在安装LAMP时,包需要libgd.so文件,而这个文件属于GD软件包。但是在安装GD软件包时,可能这个软件包跟其他软件包又具有依赖关系,又需要安装其他软件包才行。这时有的管理员便失去耐心。在遇到这种Linux软件包依赖关系问题时,该如何解决呢?在谈这个具体的措施之前,先跟大家聊聊Linux系统里的软件依赖性问题。
一、什么是依赖性耐唤明
程序依赖于程序代码的共享库,以便它们可以发出系统调用将输出发送到设备或打开文件等(共享库存在于许多方面,而不只局限于系统调用)。没有共享库,每次程序员开发一个新的程序,每个程序员都需要从头开始重写这些基本的系统操作。当编译程序时,程序员将他的代码链接到这些库。如果链接是静态的,编译后的共享库对象代码就添加到程序执行文件中;如果是动态的,编译后的共享库对象代码只在运行时需要它时由程序员加载。动态可执行文件依赖于正确的共享库或共享对象来进行操作。rpm依赖性尝试在安装时强制实施动态可执行文件的共享对象需求,以便在以后当程序运行时不会有与动态链接过程有关的任何问题。
注意:还有一种类型的依赖性,它基于显式的条目,rpm通过程序员将该依赖性强加到rpm配置文件中,但目前我们不关心这种类型的依赖性,这种依赖性比较容易解决。这里将重点放在rpm强制实施的更加复杂的共享对象依赖性。
二、动态可执行文件和共享对象
动态可执行文件使用最初编译和链接程序时使用的库文件的共享对象名称来查找共享对象。它们在少数的几个标准位置查找,比如在/lib和/usr/lib目录及在LD_LIBRARY_PATH环境变量(主要用于指定查找共享库,比如我们在安装Oracle时指定路径,exportLD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib)指定的目录中。顺便提一下,在这些库目录中找到的共享对象可能不是真正的文件;它们可能是指向位于其他位置的真实库文件的符号链接(但通常仍旧在标准库目录的一个目录中)。至少从系统管理员的观点是在用于创建共享库文件的共享库软件包的名称和共享库文件的名称之间通常没有什么关系。例如,GLIBC2.3软件包用于创建libc.so.6共享库文件。也从本示例中注意到,添加到共享库文件名结束的版本号(.6)跟用于创建它的版本号(2.3)没有关系。这是由共享库软件包开发人员有意完成的,以便GLIBC的新版本可以重用相同的共享库文件名libc.so.6。这允许您在系统上加载新版本的GLIBC,而不用中断动态链接到lib.so.6共享库文件的所有昌告程序,当然假定新版本的GLIBC向后与动态可执行文件最初所链接的老版本GLIBC兼容。因此,即使库文件或共享对象文件有与它们相关的版本号,这些版本号也不能帮助你确定他们来自哪个版本的共享软件包。
注意:当将whatprovides选项用于rpm查询命令时,可以获得有关使用rpm软件包加载到系统的现有共享对象的信息。这种混乱是由下面的事实造成的:单个共享库文件可能支持某个范围的共享库软件包版本。例如,要检查soname库文件/lib/libc.so.6支持的GLIBC共享库软件包,运行下面的链丛命令:
#objmp--all-headers/lib/libc.so.6|less
向下滚动此报告,直到到达Versiondefinitions:部分,以便查看libc.so.6共享库文件支持哪些GLIBC版本:
Versiondefinitions:
10x010x0865f4e6libc.so.6
20x000x0d696910GLIBC_2.0
30x000x0d696911GLIBC_2.1
GLIBC_2.0
40x000x09691f71GLIBC_2.1.1
GLIBC_2.1
50x000x09691f72GLIBC_2.1.2
GLIBC_2.1.1
60x000x09691f73GLIBC_2.1.3
GLIBC_2.1.2
70x000x0d696912GLIBC_2.2
GLIBC_2.1.3
80x000x09691a71GLIBC_2.2.1
GLIBC_2.2
90x000x09691a72GLIBC_2.2.2
GLIBC_2.2.1
100x000x09691a73GLIBC_2.2.3
GLIBC_2.2.2
110x000x09691a74GLIBC_2.2.4
GLIBC_2.2.3
120x000x09691a76GLIBC_2.2.6
GLIBC_2.2.4
130x000x0d696913GLIBC_2.3
GLIBC_2.2.6
140x000x09691972GLIBC_2.3.2
GLIBC_2.3
150x000x09691973GLIBC_2.3.3
GLIBC_2.3.2
160x000x09691974GLIBC_2.3.4
GLIBC_2.3.3
170x000x0d696914GLIBC_2.4
GLIBC_2.3.4
180x000x0d696915GLIBC_2.5
GLIBC_2.4
190x000x0963cf85GLIBC_PRIVATE
GLIBC_2.5
200x000x0b792650GCC_3.0
在本示例中,1ibc.so.6共享库文件支持原先为GLIBC版本2.0到2.5而开发的所有动态执行文件。注意:也可以使用objmp命令来从共享库文件中提取soname,命令如下所示:
#objmp--all-headers/lib/libcrypto.so.0.9.8b|grepSONAME
SONAMElibcrypto.so.6
objmp:/lib/libcrypto.so.0.9.8b:
接下来,将讨论rpm软件包是如何生成的,以便在新系统上安装rpm软件包时,这些共库依赖性是己知的。
三、Rpm软件包和共享库依赖性
当程序员生成rpm软件包时,ldd命令用于报告动态可执行文件软件包中所有动态可执行文件使用的所有共享库。另一个混乱是由下面的事实带来的:相同软件包中的不同动态可执行文件可能与相同的共享库软件包的不同版本进行链接。例如,Heartbeat软件包中的不同程序可能已经进行了开发,并动态链接到libc.so.6sonmae共享库文件的不同GLIBC版本。对rpm命令使用-q和--requires参数,可以看到rpm软件包需要的共享库的完整清单。例如,要看到Heartbeatrpm软件包所有的所需依赖性,请使用命令:
#rpm-q--requires-pheartbeat-1.x.x.i386.rpm
这产生了下面的报告:
sysklogd
/bin/sh
/bin/sh
/usr/bin/python
ld-linux.so.2
libapphb.so.0
libc.so.6
libc.so.6(GLIBC_2.0)
libc.so.6(GLIBC_2.1)
libc.so.6(GLIBC_2.1.3)
libc.so.6(GLIBC_2.2)
libc.so.6(GLIBC_2.3)
libccmclient.so.0
libdl.so.2
libglib-1.2.so.0
libhbclient.so.0
libpils.so.0
libplumb.so.0
libpthread.so.0
librt.so.1
libstonith.so.0
注意,在此报告中,libc.so.6soname是所需要的,此共享库必须支持使用GLIBC共享软件包版本号2.0、2.1、2.1.3、2.2和2.3进行链接的动态可执行文件。这是由下面的事实决定的:Heartbeat软件包中的不同动态可执行文件是针对不同版本的libc.so.6库的每个版本进行链接的。在了解了动态可执行文件、共享对象、soname和共享库软件包彼此是如何相关的后,下面准备来看这样的一个例子:当尝试安装rpm软件包,并且它由于依赖性错误而失败时,会发生什么。yum能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。
四、手工解决依赖性问题
通常,当尝试安装发行版中没有包括的软件包(及不能由像up2date、apt-get或Yum一样的更新工具自动解决其依赖性的软件包)时,将碰到rpm依赖性错误。例如,如果尝试在老的Linux发行版上使用rpm–ivh*rpm命令,例如所有的Heartbeatrpm包,那么在安装过程中就可能碰到下面的错误:
error:faileddependencies:
libc.so.6(GLIBC_2.3)isneededbyheartbeat-1.x.x
libc.so.6(GLIBC_2.3)isneededbyheartbeat-pils-1.x.x
libcrypto.so.0.9.6isneededbyheartbeat-stonith-1.x.x
libsnmp-0.4.2.6.soisneededbyheartbeat-stonith-1.x.x
注意,rpm命令没有干扰报告所需的每个GLIBC共享库软件包版本号——它只报告所需的最高编号的版本号(GLIBC_2.3)。(假定原来的软件包开发人员不会将相同软件包中的可执行文件链接到不兼容版本的共享库软件包)所有的这些故障都报告所需的共享库名称或soname(而不是文件名称,soname始终以“lib”开始)。但可以删除添加到rpm报告的soname结束的版本号,并快速检查以查看是否在系统中使用locate命令安装这些共享库(假设您的locate数据库是最新的,有关更多信息,请参阅locate或slocate的手册页)。例如,要查找libcrypto享库文件,要输入:
#locatelibcrypto
[root@localhost~]#locatelibcrypto
/lib/libcrypto.so.0.9.8b
/lib/libcrypto.so.6
/root/.Trash/vmware-tools-distrib/lib/lib32/libcrypto.so.0.9.8
/root/.Trash/vmware-tools-distrib/lib/lib32/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/root/.Trash/vmware-tools-distrib/lib/lib64/libcrypto.so.0.9.8
/root/.Trash/vmware-tools-distrib/lib/lib64/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/lib/libcrypto.a
/usr/lib/libcrypto.so
/usr/lib/pkgconfig/libcrypto.pc
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8/libcrypto.so.0.9.8
如果此命令没有在系统上找到一个libcrypto共享库文件,将需要转到Internet并找出哪个共享库软件包包含此共享库文件。完成此项工具的一个快速和简便方式是只要在http://rpmfind.net上将共享库的名称输入到搜索栏中。如果将文本libcrypto.so输入到此搜索贞中,将很快知道此共享库是由openssl软件包提供的。

如果老版本的共享库数据包已经安装在系统上,可以用如下的命令确认此软件包含您需要的共享库文件:
#rpm-q--providesopenssl
[root@localhost~]#rpm-q--providesopenssl
config(openssl)=0.9.8b-10.el5
lib4758cca.so
libaep.so
libatalla.so
libchil.so
libcrypto.so.6
libcswift.so
libgmp.so
libnuron.so
libssl.so.6
libsureware.so
libubsec.so
openssl=0.9.8b-10.el5
此命令报告此rpm软件包中提供的所有内容(这包括软件包提供的共享库文件的soname)。注意:如前面指出的,共享库软件包版本号没有并且应该没有与共享库文件(soname)版本号的任何对应关系。这里不进行这方面的讨论,因为soname符号链接可能指向不同版本的共享库文件,这也是在尽量避免在安装新版本的共享软件包时中断现有动态可执行文件的情况下完成的。
五、自动解决依赖性故障
当您使用rpm软件包来生成、升级或添加新的特性到系统时,依赖性故障可能很快变成一场恶梦。只要通过使用您的发行版供应商的升级服务或工具,就可以避免这场恶梦。例如,当选择要安装的rpm软件包时,RedHat工具up2date自动从RedHat下载并安装所有rpm依赖性。下面就点上列出了几个完成相同事情的支持社区的免费方法:http://www.rpm.org/。下面将只进一步看到这些自动更新工具中的一种:Yum。
1.使用Yum来安装rpm软件包
Yum(YellowdogUpdater,Modified)程序可从下面网址下载:http://yum.baseurl.org/download/3.4/yum-3.4.3.tar.gz
在下载了此软件包后,可以使用下面的命令像任何其他rpm软件包那样安装它:
#rpm-ivhyum*
您可能需要更新想用于下载您的rpm软件包的存储库。有关Fedora的可用Yum存储库的清单在http://www.fedoratracker.org要切换到不同的存储库,下载这些文件中的一个文件,并将该文件作为/etc/yum.conf文件安装。现在可以用下面的命令告诉Yum报告存储在Yum存储库中、可用于安装所有软件包:
#yumlist
[root@localhost~]#yumlist|more
.
RHNsupportwillbedisabled.
Loading"security"plugin
Loading"rhnplugin"plugin
InstalledPackages
Deployment_Guide-en-US.noarch5.2-9installed
Deployment_Guide-zh-CN.noarch5.2-9installed
Deployment_Guide-zh-TW.noarch5.2-9installed
GConf2.i3862.14.0-9.el5installed
GConf2-devel.i3862.14.0-9.el5installed
ImageMagick.i3866.2.8.0-4.el5_1.1installed
MAKEDEV.i3863.23-1.2installed
MySQL-python.i3861.2.1-1installed
NetworkManager.i3861:0.6.4-8.el5installed
NetworkManager-glib.i3861:0.6.4-8.el5installed
2.用Yum安装新的rpm软件包
在本示例中,将安装新的GLIBC软件包。用简单的命令安装最新的GLIBC及其所有依赖性:
#yumupdateglibc
如果一切正常,Yum程序将自动检测、下载并安装最新GLIBC软件包所需要的所有rpm软件包(这里的GLIBC软件包是为您的发行版而构建的,不一定是可用的最新版GLIBC软件包(使用发行版所批准的GLIBC共享库软件包版本号或冒险安装没有使用正常系统操作所需要的动态可执行文件的GLIBC软件包版本)。也可以将list参数用于Yum和grep命令来查找要安装的软件包。例如,要查找名称中有SNMP的软件包,请输入:
#yumlist|grepsnmp
此命令返回如下报告:
.
RHNsupportwillbedisabled.
net-snmp.i3861:5.3.1-24.el5installed
net-snmp-libs.i3861:5.3.1-24.el5installed
net-snmp-perl.i3861:5.3.1-24.el5installed
net-snmp-utils.i3861:5.3.1-24.el5installed
现在可以容易地使用YUM下载并安装所有这些rpm软件包。
六、关于升级Gilbc的建议
Glibc库是Linux底层的运行库,其性能对于整个系统的运行有重要的意义。Glibc库包含了大量函数,其中的函数可大致分成两类,一类是与操作系统核心沟通的系统调用接口,它们作为功能型函数被调用,提供对Linux操作系统调用的包装与预处理。另外一类为一般的函数对象,它们提供了经常使用的功能的实现,作为工具型函数使用。在实践中,有不少软件就是依赖与Glibc版本才能安装并运行,说白了对于Glibc版本要求是版本高了不行,低了还不成。这些编译环境中的应用程序也和其它程序一样必须有运行的环境,我常遇到管理员在生产中给服务器装了最新的Linux发行版,结果应用软件装不上去,原因是Glibc的版本不对,有的是写在原发行版glibc上升级有的是降级,结果倒是整个系统的崩溃,实践经验告诉我,你只有选择相应Linux发行版里对应的glibc,例如我们单位的一个应用软件时在rhel3.0下开发的,那么就得要对应的发行版,换了别的就难说了,任何自己升级或降级Glibc来适应应用软件的做法都是不可取的,问题最后的解决方法是找到了RHEL3装上就解决了。在表一中,我把几个linux发行版原配的Glibc版本列出,供大家参考。
点击图片查看大图

Glibc库与核心功能组件
上图一说明:
GCC依赖于glibc
binutils依赖于glibc(binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编)
make依赖于glibc
头文件是在编译时候gcc所需要的,但本身都是一些文本文件,因此没有需要的运行环境。
常用工具依赖于glibc和各种需要用到的动态库。
下表一列出了多个重要Linux发行版的Glibc的情况
Linux发行版Glibc版本
Redhat9glibc-2.3.2-5
Fedora1glibc-2.3.2
RedhatEnterpriseLinuxAs3glibc-2.3.2-95
RedhatEnterpriseLinuxAs4glibc-2.3.4
RedhatEnterpriselinux5glibc-2.5-24
RedhatEnterpriselinux6glibc-2.9
Centos5.xglibc-2.5
-2.3.2-92
-2.4.31.54
-2.9

点击图片查看大图

Linux发行版glibc(32)位
下面介绍几个查询glibc版本号的方法:
#ls–al/lib/libc*
或者是用下面的命令也可以实现
#rpm–qp|grepglibc
基于debian的系统通过dpkg–l|greplibc6也可以查到,总之一般都在/usr/share/doc目录下都能看到glibc的相关信息。
七、小结
大部分情况下,在遇到软件包依赖关系问题的时候,操作系统提供的文件名字与软件包名字都会有直接的联系。有可能文件的名字就是软件包的名字。但是有些时候文件的名字与软件包的名字会相差甚远。此时大部分系统管理员可能光凭文件名字无法找到对应的软件包。此时可以先在系统安装光盘里找,如果找到那时最佳选项,然后就需要借助笔者上面谈到的一些专业网站,去查询软件包的名字了。当系统管理员安装了某个软件之后,如果存在软件包之间的依赖关系,则最好能够拿本子或者通过其他手段记录下来。以便下次方便实用,注意工作中的积累,相信绝大部分的软件包依赖关系问题都会迎刃而解。

㈩ linux命令行中输入as,就不能打命令了,也退不出去

不知道as指令是干嘛用的,刚刚也没查到。我在输入as后,出现了你同样的情况,在linux中碰到了这种问题一般是强制杀死掉该进程,做法就是按下crtl+c.

另一种做法,要求你是超级用户root登录,另开一个中断,输入ps -le能看到所有进程,找到as进程,它会有个pid,输入kill as进程的pid,也可以中断它,这是你在没有as进程的终端输入时候使用的办法,一般用来杀死其它人的死循环进程或者是不友善进程。

热点内容
云访问安全 发布:2025-05-17 18:36:31 浏览:625
算法设计与分析课件 发布:2025-05-17 18:21:11 浏览:766
安卓禁止软件安装怎么解除 发布:2025-05-17 18:16:52 浏览:219
绝地求生极客电脑怎么配置 发布:2025-05-17 18:16:50 浏览:51
显卡编程语言 发布:2025-05-17 18:11:46 浏览:919
编程用什么轴机械键盘 发布:2025-05-17 18:10:35 浏览:960
金融工程编程 发布:2025-05-17 18:10:33 浏览:224
私密模式访问 发布:2025-05-17 18:09:44 浏览:788
数据库崩溃原因 发布:2025-05-17 18:09:42 浏览:307
对虾养殖增氧机如何配置 发布:2025-05-17 18:08:20 浏览:443