还剩8页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
动态连接库和符号symbolshared library.so是很好的材料,下面的Program LibraryHowto-Shared Libraries内容多是据此整理的.定义Shared librariesare librariesthat areloaded byprogramswhen theystart.使用共享库会有很多好处,比如软件升级,不难想shared library象.命名约定每个共享库都有一个形式为
1.soname:sonamef,,,,其中是版本号.如libNAME.so.x x“libc.so.6”.f,真正的库文件,一般形式为即
2.real name:“soname.yLz]”11其中是是libName.so.x.yteZ],y minornumber,z release是可选的.如number,“libattr.so.l.l.O”.用来请求库时使用的名字,一般是没有
3.linker name:compiler版本号的soname.放置位置load/preload:共享库一般放在一些约定的目录下,如/usr/lib/,/usr/local/lib,等.这其实是遵循的,比如下放置的一般是用/lib/FHS/usr/local/lib户开发的库.在启动程序时,会找到并加载程program loaderld-limjx.so.x序需要的共享库,查找的路径一般就是上述的几个目录,这些录loader在文件中配置./etc/ld.so.conf如果只想覆盖共享库的某几个函数,保持其余函数不变,则可以将共享库名字和函数名字输入到中,这里面定义的规/etc/ld.so.preload则会覆盖标准规则.cache arrangementIdconfig实际上,在启动程序时再去搜寻所需的共享库不是高效做法,所以在各个库录中,对共享库设置合适的(使得遵守命名约symbolic link使用了的作用就是读取文件loader cache.Idconfig/etc/ld.so.conf.定),然后写入某种数据到.这个文件再今后就被其他/etc/ld.s cache,程序使用,从而大幅提升了共享库的直找速度.改库录)的时候,最要运行Idconfig.所以在每加入/移除一个共享库,或者修改了(即修/etc/ld.so.conf创建共享库编译出需要使用-或■力和stepl.object files,eZC/cflag.fPIC的区别是,前者生成的文件更大,不过具有更好的平台无关性,后者恰fpic好相反.这说明前者为了做了更多工作.platform-independence用向传递参数.如・step
2.WI linkergcc-shared-Wl-f.把共享库拷贝到约定的某个录下即可,step3in/usr/local/lib.nsonamejibmystuff.soel-o libmystuff.so.
1.
0.1a.o b.o-lc.step
4.Idconfig-n/path/to/lib.elf的内容参考参它是一种格式,也是一种elf Iflibelf,elftoolchain,规范,可以用写程序去操作它,可以用、和libelf objdumpnm readelf去读取文件的内容.elfsymbols我也已经熟悉共享库了,我知道的作用,我知道常用的库放Idconfig置目录,我知道可以用来帮助确认某程序和某些共享库的关联Itrace,Idd关系是否正确.所以,如果没有这一节,本篇文章存在的意义不大.symbols是绝佳的资料,当然正如很多网文一样,Inside ELFSymbol Tables”它仅是帮助理解,而不涉及很深的细节.细节标准什么的还是要看书和文档了,这方面很不错的书籍就是校友的程序员的自我修养了.查看规范,你必然可以看到和如elf symtabdynsym,ELF-64Object中就列出了标准的File Format
4.Sections sections,.symtab和就是其中之二..dynsym实际上,我们知道机器可执行的是而我们使用的高级machine code,语言编程,并不是利用晦涩的机器码,而是用的变human-readable量名,函数名等,这些名字就是编译器在编译时收symbolic name.集信息,并储存在的和中.symbol object file.symtab.dynsym是和所必需的信息,如果没有symbols linkerdebugger symbols,试想如何能展示给用户调试信息了?如果没有debugger symbol,而只有地址相对于的如何能够链接多object fileoffset,linker个了objectfile对于和我们可以做个小实验linker symbol,//编写一个简单的a.c$cat a.cvoid funcvoidprintfcallfunc\n;$nm a.o00000000T funcU puts〃编写一个简单的main.c$cat main.c#include stdio.hextern voidfuncvoid;int mainfunc;return0;$nm main.oU func00000000T main//正常情况下$gcc main.o a.o-o main$./maincall func//为了验证对于来说是必需品,我做如下操作symbol linker$file a.oa.o:ELF32-bit LSBrelocatable,Intel80386,version1SYSV,not stripped$strip a.o$file a.oa.o:ELF32-bit LSBrelocatable,Intel80386,version1SYSV,stripped$gcc main.o a.o-o mainmain.o:In functionmain’:/home/xan/lab/main.c:7:undefined referenceto funccollect2:Id returned1exit status这个小实验证实了对于的重要性,同时使用看出symbols linkerfile的变化,说的就是去除了信息.not stripped4stripped symbols现在假使我们生成了最后的可执行文件当然是格式了,那么这elf个中是否包含呢?其中又是否需要呢?elf symbolssymbols不妨先下结论:一般地,生成的可执行文件都是包含不过这symbols,些信息不是程序执行所必需的,可以通过stripDiscard symbolsfrom去除.object files同样可以做个小实验//仍用上面实验的代码$file mainmain:ELF32-bit LSBexecutable,Intel80386,version1SYSV,dynamically linkeduses sharedlibs,for GNU/Linux
2.
6.18,notstripped$./maincall func$strip main$file mainmain:ELF32-bit LSBexecutable,Intel80386,version1SYSV,dynamically linkeduses sharedlibs,for GNU/Linux
2.
6.18,stripped$./maincall func这个小实验证实了对于可执行文件来说不是必需的,这是symbols因为可执行的代码都是只需要信息,无需machine code,address信息.symbol对于和还是好理解的啦.就是我文件中留了一席之elf symbols,elf地给你放在生成时会往其中填充.symbols,compiler elf等可以来读取.不过这些不是程序执行debugger/nm/readelf symbols必需的,所以完全可以去除只不过去除之后,就读不到信息了.debugger而对于共享库来说,情况略复杂些了.我们来特别说明.共享库和symbols在继续下去之前,先来看两个事实.$Idd/bin/lslinux-gate.so.l=0xb7711000libselinux.so.l=/lib/libselinux.so.l0xb76e5000librt.so.l=/Iib/i686/cmov/librt.so.l0xb76dc000libacl.so.l=/lib/libacl.so.l0xb76d4000libc.so.6=/Iib/i686/cmov/libc.so.60xb758d000Iibdl.so.2=/Iib/i686/cmov/libdl.so.20xb7589000/lib/ld-linux.so.20xb7712000libpthread.so.O=/Iib/i686/cmov/libpthread.so.00xb7570000libattr.so.l=/lib/libattr.so.l0xb756b000$nm/Iib/i686/cmov/libc.so.6也一nm:/Iib/i686/cmov/libc.so.6:no symbols—libattr,libacl样,都显示no symbols//而有一大串libpthread$nm/Iib/i686/cmov/libpthread.so.0|tailU twalk@@GLIBC_
2.0U uname@@GLIBC_
2.0U unlink@@GLIBC_
2.00000c930t unwind_cleanup0000c970t unwind_stopOOOOcfdO Wvfork0000de90W waitOOOOdf5O Wwaitpid0000cl40t walker0000d020W write这仅仅是因为有些库做了而其他库没做而已?还是说对strip,strip于某些共享库来说,也是必需的?symbols目前不知答案,分析下去.前面提到和两个不同的它们有什么.symtab.dynsym symboltable,区别?是的一个子集,大家都有疑问,为什么要两个信息.dynsym.symtab重合的结构?需要先了解文件包含allocable/non-allocable ELFsection,ELF一些如和是在运行时需要的,这些被称sections codedata sections为而其他一些仅仅是等工具allocable;sections linker,debugger需要,在运行时并不需要,这些被称为的.sections non-allocable当构建文件时,它把的数据放到一个地方,将linker ELFallocable的数据放到其他地方.当加载文件时,仅仅non-allocable OSELF的数据被映射到内存,的数据仍静静地呆在allocable non-allocable文件里不被处理.就是用来移除某些的.strip non-allocable sections包含大量需要的数据,但并不为.symtab linkerdebuggerf必需,它是的;包含的一个runtime non-allocable.dynsym.symtab子集,比如共享库所需要在加载的函数对应的它世runtime symbols,的.allocable因此得到答案:移除的应是
1.strip.symtab.读取的应是上面发现的等结果为空,
2.nm.symtab:libattr nm结果非空应是正常的.共享库包含的是libpthread nm
3..dynsym必需的,是的.runtime allocable可做验证,期望的结果为依然能够工作.
1.strip libpthread,Is得到结果为空.
2.strip libpthread,nm libpthread可以通过设置或使用读出的内
3.nm options,readelf.dynsym容.$sudo strip/Iib/i686/cmov/libpthread-
2.
11.
3.so$file/Iib/i686/cmov/libpthread-
2.
11.
3.so/Iib/i686/cmov/libpthread-
2.
11.
3.so:ELF32-bit LSBsharedobject,Intel80386,version1SYSV,dynamically linkedusesshared libs,for GNU/Linux
2.
6.18,stripped$Is…(输出正确结果)$nm/Iib/i686/cmov/libpthread-
2.
11.
3.sonm:/Iib/i686/cmov/libpthread-
2.
11.
3.so:no symbols$readelf-s/Iib/i686/cmov/libpthread-
2.
11.
3.so|tail322:0000b6a0292FUNC GLOBAL DEFAULT13pthread_clock_gettime@@GLIBC_PRIVATE323:0000ec3046FUNC GLOBAL DEFAULT13pthread_mutex_consistent_@@GLIBC_
2.4324:0000b3a050FUNC GLOBAL DEFAULT13pthread_testcancel@@GLIBC_
2.0325:0000d6b0111FUNC WEAKDEFAULT13fsync@@GLIBC_
2.0326:OOOOdlfO180FUNC WEAKDEFAULT13fcntl@@GLIBC_
2.0327:OOOOddeO176FUNC WEAKDEFAULT13tcdrain@@GLIBC_
2.0GLOBALDEFAULT13328:000093907FUNCpthread_mutexattr_destroy@@GLIBC_
2.0329:00006de023FUNC GLOBALDEFAULT13pthread_yield@@GLIBC_
2.2330:000077c0259FUNC GLOBALDEFAULT13pthread_mutex_init@@GLIBC_
2.0331:000093c049FUNC GLOBALDEFAULT13pthread_mutexattr_setpsha@@GLIBC_
2.2$readelf-s/lib/libattr.so.
1.
1.0|tail48:00002f5050FUNC GLOBALDEFAULT13lremovexattr@@ATTR_
1.049:0000301057FUNC GLOBALDEFAULT13llistxattr@@ATTR_
1.050:00002ae050FUNC GLOBALDEFAULT13attr_copy_check_permissio@@ATTR_l.l51:00001b50259FUNC GLOBALDEFAULT13attr_set@@ATTR_
1.052:00002b201002FUNC GLOBALDEFAULT13attr_copy_action53:000031f071FUNC GLOBALDEFAULT13setxattr@@ATTR_
1.054:00001380543FUNC GLOBALDEFAULT13attr_list@@ATTR_
1.255:000030d064FUNC GLOBALDEFAULT13lgetxattr@@ATTR_
1.0GLOBALDEFAULT1356:00002fd057FUNCflistxattr@@ATTR_
1.0GLOBALDEFAULT1357:00002fl050FUNCfremovexattr@@ATTRJLO至此,对和共享库,的关系的了解告一段落.symbols ELFmore既然已经说到共享库不妨稍微提一下shared library,动态装载库共享库是在程Dynamically LoadedLibraries,序时被加载,而注意区别于下的概startup DLLwindows念则是在程序运行过程中显式被加载,实际上就是调用等接口显式地打开共享库,显示地查找库中的dlopen^lsym然后找到对应的代码去执行.symbol,How ToWrite SharedLibraries byUlrich Drepper.-EOF-。
个人认证
优秀文档
获得点赞 0