培训课件及7课本7中load工具_第1页
培训课件及7课本7中load工具_第2页
培训课件及7课本7中load工具_第3页
培训课件及7课本7中load工具_第4页
培训课件及7课本7中load工具_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

GNU的编译器FrancHE1.1使用GCC

GCC编译器完成从C、C++、objective-C等源文件向运行在特定CPU硬件上的目标代码的转换(这是任何一个编译器需要完成的任务)。GCC能够处理的源文件分为C、C++、Objective-C、汇编语言等。1.1使用GCC

1.1GCC的用法 GCC的使用语法: gcc[option|filename]... g++[option|filename]... 其中option

为gcc使用时的选项,而filename为欲以gcc处理的文件。 说明: 这两个C与C++的compiler已将产生新程序的相关程序整合起来。产生一个新的程序需要经过四个阶段:预处理、编译、汇编,连结,

而这两个编译器都能将输入的文件做不同阶段的处理。1.1使用GCC

gcc

预设经由预处理过(扩展名为.i)的文件为C语言,并于程序连结阶段以C的连结方式处理。g++

预设经由预处理过(扩展名为.i)的文件为C++语言,并于程序连结阶段以C++的连结方式处理。1.1使用GCC

原始程序码的扩展名指出编写程序所用的语言,以及相对应的处理方法:.c

C原始程序

预处理、编译、汇编.C

C++原始程序

预处理、编译、汇编.cc

C++原始程序

预处理、编译、汇编.cxx

C++原始程序

预处理、编译、汇编.m

Objective-C原始程序

预处理、编译、汇编1.1使用GCC

.i

已经过预处理之C原始程序

编译、汇编.ii

已经过预处理之C++原始程序

编译、汇编.s

组合语言原始程序

汇编.S

组合语言原始程序

预处理、汇编.h

预处理文件(标头文件)

(不常出现在指令行) 其他扩展名的文件是由连结程序来处理,通常有:.o

Objectfile.a

Archivefile1.1使用GCC

1.1.2GCC选项GCC的运行选项共分为12类,这是类选项从12个方面控制着GCC程序的运行,以达到特定的编译目的。

(1)全局选项(OverallOptions) a)–x

language 对于源文件是用什么语言编写的,可以通过文件名的后缀来标示,也可以用这选项。 b)–xnone 把上面介绍的-x选项都给关掉了。

1.1使用GCC

c)-c 编译成把源文件目标代码,不做连接的动作。 d)-S 把源文件编译成汇编代码,不做汇编和连接的动作。 e)-E 只把源文件进行预处理之后的结果输出来。不做编译、汇编、连接的动作。

1.1使用GCC

f)-ofile 指明输出文件名是file。 g)-v 把整个编译过程的输出信息都给打印出来。 h)–pipe 由于gcc的工作分为好几步才完成,所以需要在过程中生成临时文件,使用-pipe就是用管道替换临时文件。1.1使用GCC

(2)语言相关选项(LanguageOptions)用来处理和语言相关的控制选项。主要包括如下选项:-ansi-fall-virtual-fcond-mismatch

-fdollars-in-identifiers-fenum-int-equiv

-fexternal-templates-fno-asm-fno-builtin-fno-strict-prototype-fsigned-bitfields

-fsigned-char-fthis-is-variable

-funsigned-bitfields-funsigned-char

-fwritable-strings-traditional-traditional-cpp

-trigraphs1.1使用GCC

(3)预处理选项(PreprocessorOptions)用来控制预处理所设置的选项。主要包括如下项:-Aassertion-C-dD-dM-dN-Dmacro[=defn]-E-H-idirafterdir-includefile-imacrosfile-iprefixfile-iwithprefixdir-M-MD-MM-MMD-nostdinc-P

-Umacro-undef1.1使用GCC

a)–includefile 在编译之前,把file包含进去,相当于在所有编译的源文件最前面加入了一个#include<file>语句,这样做更省事。b)–imacrosfile 同-includefile一样。不过这个文件在具体编译的时候只有里面定义的宏才起作用,所以值用来在file文件里面定义宏。c)–nostdinc 在搜寻include的文件路径中去掉标准的c语言头文件搜索路径,例如stdio.h文件就是放在标准头文件搜索路径下。1.1使用GCC

d)–nostdinc++ 同上,只是去掉的是标准C++语言的头文件搜索路径。e)–C 同-E参数配合使用。让预处理后的结果,把注释保留,让人能够比较好读它。1.1使用GCC

f)–Dmacro 把macro定义为字符串“1”。g)–Dmacro=defn 把macro定义为defn。h)–Umacro 把对macro的定义取消。1.1使用GCC

(4)汇编选项(AssemblerOption)用来控制汇编行为的选项。–Wa,option:把option作为选项送给汇编程序。如果option里面有逗号,则作为好几行进行处理。1.1使用GCC

(5)连接选项(LinkerOptions) 用来控制连接过程的选项选项。主要包括如下选项:-llibrary-nostartfiles-nostdlib-static-shared-symbolic-Xlinkeroption-Wl,option-usymbola)–llibrary

连接库文件选项。1.1使用GCC

b)–lobjc 这个选项用在面向对象的C语言文件的库文件处理中。c)–nostartfiles 在连接的时候不把系统相关的启动代码连接进来。d)–nostdlib 在连接的时候不把系统相关的启动文件和系统相关的库连接进来。1.1使用GCC

e)–static 在一些系统上支持动态连接,这个选项则不允许动态连接。f)–shared 生成可共享的被其他程序连接的目标模块。1.1使用GCC

(6)目录相关选项(DirectoryOptions) 用于定义与目录操作相关的选项。a)–Idir 宏include需要搜寻的目录。b)–I- 与-I选项类似。c)–Ldir 搜寻库文件(*.a)的路径。1.1使用GCC

(7)警告选项(WarningOptions)与警告处理相关的选项。主要包括如下选项:-fsyntax-only-pedantic-pedantic-errors-w-W

-Wall-Waggregate-return-Wcast-align-Wcast-qual-Wchar-subscriptment-Wconversion-Wenum-clash-Werror-Wformat-Wid-clash-len-Wimplicit-Winline-Wmissing-prototypes-Wmissing-declarations-Wnested-externs-Wno-import-Wparentheses-Wpointer-arith-Wredundant-decls-Wreturn-type-Wshadow-Wstrict-prototypes-Wswitch-Wtemplate-debugging-Wtraditional-Wtrigraphs

-Wuninitialized-Wunused-Wwrite-strings1.1使用GCC

a)–fsyntax-only 只检查代码中的语法错误,但并没有输出。b)–w 禁止一切警告信息打印出来。c)–Wno-import 禁止对宏#import提出警告。1.1使用GCC

(8)调试选项(DebuggingOptions)与调试代码相关的选项。主要包括如下选项:-a-dletters-fpretend-float-g-glevel-gcoff-gxcoff-gxcoff+-gdwarf-gdwarf+-gstabs-gstabs+-ggdb-p-pg-save-temps-print-file-name=library-print-libgcc-file-name-print-prog-name=program–g:把调试选项打开,让编译的目标文件有调试信息。1.1使用GCC

(9)优化选项(OptimizationOptions)与优化代码相关的选项。主要包括如下选项:-fcaller-saves-fcse-follow-jumps-fcse-skip-blocks-fdelayed-branch-felide-constructors-fexpensive-optimizations-ffast-math-ffloat-store-fforce-addr-fforce-mem-finline-functions-fkeep-inline-functions-fmemoize-lookups1.1使用GCC

-fno-default-inline-fno-defer-pop-fno-function-cse-fno-inline-fno-peephole-fomit-frame-pointer-frerun-cse-after-loop-fschedule-insns-fschedule-insns2-fstrength-reduce-fthread-jumps-funroll-all-loops-funroll-loops-O-O0-O1-O2-O3-O1-O2-O3-O0,这些选项分别控制优化的强度,-O3最强。1.1使用GCC

(10)目标机选项(TargetOptions) 与目标机相关的选项。a)–bmachine 在有的时候,Gcc编译器编译出来的目标代码并不是在运行这个编译动作的机器上运行而是另外一台机器,这种编译叫做交叉编译,用来运行最终目标代码的得机器叫做目标机,machine就是用来指明目标机的类型的。b)–Vversion

用来告诉编译器使用它的多少版本的功能,version参数用来表示版本。1.1使用GCC

(11)CPU相关选项(MachineDependentOptions)与CPU相关的选项。主要包括如下选项:M680x0选项 -m68000-m68020-m68020-40-m68030-m68040-m68881SPARC选项

i386选项 -m486-mno-486-msoft-float-mno-fp-ret-in-3871.1使用GCC

(12)生成代码选项(CodeGenerationOptions)与生成代码相关的选项。主要包括如下选项:-fcall-saved-reg-fcall-used-reg-ffixed-reg-finhibit-size-directive-fnonnull-objectsmon-fno-ident-fno-gnu-linker-fpcc-struct-return-fpic-fPIC-freg-struct-returno-fshared-data-fshort-enums-fshort-double-fvolatile-fvolatile-global-fverbose-asm1.2库文件的管理与使用

Linux下的库文件分为两大类分别是动态链接库(通常以.so结尾)和静态链接库(通常以.a结尾)。两者的差别仅在程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。Linux使用ld(load)工具来加载.o,.a和.so文件。演示:gcc–vhello.c–ohello.o问题1:我们在编译hello.c时,没有使用ld来加载,为什么?问题2:collect2程序完成什么功能?

GCCusesautilitycalledcollect2onnearlyallsystemstoarrangetocallvariousinitializationfunctionsatstarttime.1.2库文件的管理与使用

默认情况下,GCC在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库。如果需要的话可以在编译时加上-static选项,强制使用静态链接库。例如,如果在/home/martin/lib/目录下有链接时所需要的库文件libfoo.so和libfoo.a,为了让GCC在链接时只用到静态链接库,可以使用下面的命令:

$gccfoo.c-L/home/martin/lib/-static-lfoo-ofoo

说明:-lfoo自动回去找libfoo.a。1.2库文件的管理与使用

ELF格式的可执行文件使得动态链接库(ELF格式)能够比较容易地实现(原因是elf格式带有比较完整的文件头,其中含有必须的加载地址信息),当然使用旧的a.out模式也可以实现库的共享。Linux系统中目前可执行文件的标准格式为ELF格式。静态链接库在编译连接时,把库文件的代码全部加入到可执行文件中,所以生成的文件较大,但运行时,就不再需要库文件了。动态链接库正好相反,在编译连接时,没有把库文件的代码加入到可执行文件中,所以生成的文件较小,但运行时,仍需要加载库文件。1.2库文件的管理与使用

1.2.1库文件命名系统中可用的库都存放在/usr/lib和/lib目录中。库文件名由前缀lib和库名以及后缀组成。根据库的类型不同,后缀名也不一样。动态链接库的后缀名由.so和版本号组成,静态链接库的后缀名为.a。动态链接库的后缀名为.so。表示如下: libname.so.major.minor libname.a

这里的name可以是任何字符串,用来唯一标识某个库。例如:libc.so.6

1.2库文件的管理与使用

1.2.2库文件操作 Linux库操作可以使用命令完成,目前常用的命令是ldd和ldconfig。

(1)lddldd是LibraryDependencyDisplay缩写,它的作用是显示一个可执行程序必须使用的共享库。参数:-d:执行重定位并报告所有丢失的函数 -r:执行对函数和数据对象的重定位,报告丢失的函数或数据对象。 很明显,-r是-d的进一步的操作,-d只能定位到函数。演示:

$ldd/usr/bin/mesg libc.so.6=>/lib/tls/i686/cmov/libc.so.6(0xb7eaf000)/lib/ld-linux.so.2=>/lib/ld-linux.so.2(0xb7feb000)1.2库文件的管理与使用

(2)ldconfig(在/sbin/下,默认情况只有root或特权用户能看到) 库安装到系统以后,为了让动态链接库为系统所认识及共享,就需要运行ldconfig。ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表,ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。关于ldconfig,这里描述一下以下事情: 1)ldconfig的作用是搜索到系统中存在的库文件,并且填写ld.so.cache文件,不负责真正的加载库的过程 2)ldconfig的搜索路径包括:/lib,/usr/lib和/etc/ld.so.conf 3)如果用户的库有所改变,也就是说上述三个内容有所改变,那么如果调用ldconfig,ldconfig会把改变的内容写到/etc/ld.so.conf中。 4)ldconfig的输出是Linux加载器(ld.so)的输入1.2库文件的管理与使用

(1)命令格式ldconfig[选项][libs](2)主要选项-v或--verbose:ldconfig将显示正在扫描的目录、搜索到的动态链接库,以及它所创建的连接的名字。-fCONF:指定动态链接库的配置文件为CONF,系统默认为/etc/ld.so.conf。1.2库文件的管理与使用

-CCACHE:指定生成的缓存文件为CACHE,系统默认的是/etc/ld.so.cache,文件存放已排好序的可共享的动态链接库的列表。-p或--print-cache:让ldconfig打印出当前缓存文件所保存的所有共享库的名字。-rROOT:改变应用程序的根目录为ROOT。-n:ldconfig仅扫描命令行指定的目录,不扫描默认目录(/lib、/usr/lib),也不扫描配置文件/etc/ld.so.conf所列的目录。1.2库文件的管理与使用

1.2.3库文件升级 Linux库函数的升级是一项重要的工作,往往与其它软件包的升级有一定关联作用,所以操作前一定要备份文件。下面看一下如何把Glibc2.2.4.13升级至2.3.2版本,其过程如下: (1)下载.gz压缩文件并解压 在GUNC网站下载的四个.gz压缩文件,解压至一临时目录中:1.2库文件的管理与使用

$cd/usr/martin_linux$tarxzvfglibc-2.3.2.tar.gz$cdglibc-2.3.2$tarxzvf../glibc-linuxthreads-2.3.2.tar.gz$tarxzvf../glibc-crypt-2.3.2.tar.gz$tarxzvf../glibc-localedata-2.3.2.tar.gz(2)建立库函数的安装目录

$mkdir/usr/higlibc$cd/usr/higlibc(3)建立编译目录 $mkdirmartin$cdmartin$./configure--enable-add-ons=linuxthreads,crypt,localedata-prefix=/usr/higlibc1.2库文件的管理与使用

(4)编译与安装 $make$makecheck$makeinstall(5)改变数据库的链接 $ln-s/usr/higlibc/lib/ld-linux.so.2/lib/ld-linux.so.2然后,修改/etc/ld.so.conf,加入一行/usr/higlibc/lib,执行下面命令: $ldconfig–v更新/etc/ld.so.cache的内容,列出每个库的版本号,扫描目录和所要创建及更新的链接。1.2库文件的管理与使用

(6)更改GCC设置

$cd/usr/lib/gcc-lib$cp-ri386-redhat-linuxhiglibc(7)更新符号链接

$cd/usr/higlibc/include$ln-s/usr/src/linux/include/linux$ln-s/usr/src/linux/include/asm$ln-s/usr/X11R6/include/X11(8)测试并完成1.2库文件的管理与使用

1.2.4库文件使用使用gcc编译器就可以将库与自己开发的程序连接起来,例如:libc.so中包含了标准的输入输出函数,当连接程序进行目标代码连接时会自动搜索该程序并将其连接到生成的可执行文件中。1.2库文件的管理与使用

在/usr/lib和/lib目录中可以找到绝大多数的动态链接库。连接时将首先搜索这两个目录。有一些库也可能存放在特定的目录中,在/etc/ld.conf配置文件中给出了这些目录的列表。连接程序也会对列出的这些目录进行搜索。在默认情况下,Linux将首先搜索指定库的动态版本,如果找不到,才会去搜索静态版本。在对共享库进行更新或安装新库后,必须运行ldconfig命令更新/etc/ld.conf文件中相应的项(如果使用RPM进行安装,一般会自动进行更新,不过也不能保证这一点)。1.2库文件的管理与使用

在gcc编译器中引用可搜索到的目录中的库文件时,需要使用-l选项和库名。在gcc命令行上输入-lm可以在程序中连接标准算术库,-l将首先使用libname.so进行搜索,这里是libm.so。下面的例子将使用算术库创建bookrecs程序,请注意这里的-lm选项。 $gccmain.cio.c-obookrecs–lm1.2库文件的管理与使用

在引用其它目录中的库时,需要使用-ldir选项指定该目录。该选项指定了搜索库函数时其它路径。在下面的例子中,用户在连接时使用了mydir目录中的myio.so库文件。

$gccmain.c-obookrecs-lmydir–lmyio1.3NM命令命令nm列出编入目标的所有符号。

nm[option]file

-C将符号名转换为用户级的名字,这对C++函数特别有用(比如:a::b::c(e,f)) -s当用于存档(.a)文件时,输出把符号名映射到定义该符号的模块或成员名的索引 -u 只显示未定义的符号--调试有用 -l 使用调试信息输出定义每个符号的行号演示:

gcc–chello.c

问题:上面这句话是什么意思?现在使用nm–uhello.o

发现:UfprintfUprintfUstdoutnm–lhelloGDB

我们将看到很多行号的信息1.3编写和使用静态库静态库是包含了目标文件的文件,这些文件被称为模块或成员,是可以重用的预编译代码.它们以特殊的格式和一个表或者映射保存起来,这个表将符号名和保存该符号的成员名链接起来.映射加速了编译和链接过程.静态库一般写成.a(archive)。我们建立一个简单的出错处理库,它包含:liberr.h,liberr.c。使用如下命令建立静态库:

gcc-cliberr.c-oliberr.o

arrcsliberr.aliberr.o 其中:r:在库中插入模块(这里是liberr.o) c:创建库

s:创建从符号到定义它们的成员之间的交叉索引表(映射)演示:nmliberr.a编译出错驱动程序: gccerrTest.c-oerrTest-static-L.–lerr-lerr的意思是查找liberr库演示:fileerrTest errTest:ELF32-bitLSBexecutable,Intel80386,version1(SYSV),forGNU/Linux2.2.5,staticallylinked,notstripped 可以看到:staticallylinked演示:nmerrTest

我们可以看到没有地址不定的函数,也就是标号是U的函数。执行./errTest,我们将看到,它的作用是用四种库中定义的出错处理函数去处理打开一个不存在的文件这样一个错误。1.4编写和使用共享库共享库和静态库相比较的优点:1)共享库占用的内存少。因为共享库没有被静态的编译到每一个模块中,只是在运行时才加载。2)共享库比静态库执行快许多,因为它们只需向内存加载一次。3)共享库的维护比较容易,只需要升级库就可以,不需要完整重编译。创建共享库的过程基本如下: 1编译目标文件使用-fPIC选项 2使用GCC的-shared和-soname选项 3使用-wl选项把参数传给连接器ld 4使用GCC的-l选项显示的链接C库,以保证得到需要的启动(Startup)代码,保证程序可以在不同的版本的C库系统中正常运行。演示:“建立共享库: 编译:gcc-fPIC-g-cliberr.c-oliberrDyn 做库:gcc-g-shared-Wl,-soname,liberr.so-oliberr.so.1.0.0liberrDyn-lc 建立符号连接,使得这个库不要自动成为系统库,这个符号连接是soname: ln-sliberr.so.1.0.0liberr.so.1

另一个在链接库时使用:

ln-sliberr.so.1.0.0liberr.so 链接动态库:

gcc-gerrTest.c-oerrTestDyn-L.–lerr 执行测试程序:

LD_LIBRARY_PATH=$(pwd)./errTestDyn环境变量LD_LIBRARY_PATH把它包含的路径添加到添加到连接器(ld.so)规定的/lib和/usr/lib中,这个是ld.so这个程序规定的另一种加库的方法是把库的路径加到/etc/ld.so.conf,然后以root运行ldconfig去更新/etc/ld.so.cache。1.3Linux内核的加载过程在vmlinux中,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论