程序链接关于静态链接,动态链接,共享库,ABI的一些记录(os学习)
2013-05-27 20:18
399 查看
最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--程序链接
Static Linking
在ld时,如果找到了obj文件中存在的reference,就会到libary中去把这个reference的binary code 添加到你的程序中去。
经过了静态链接的程序,是一个真正完全的可运行的程序,运行的时候不需要其它的东东,只需要os的kernel调用这个code就行了
静态链接中,最重要的一点:把libary中的binary 程序 添加到我们调用库函数的程序中去了。
Dynamic Linking
动态链接时,在ld时,如果我们写的code中调用了库中的代码,这里不会把库中的binary code直接添加我们的code中去,而是保留这个reference,在程序加载运行时,注意是在我们的code运行时,程序中保留的那个reference就会被链接程序链接到到libary中执行。动态链接的好处就是可以使on disk 程序非常的小,勤俭和了memory,动态链接的结果就是(shared libray),动态链接的程序是要依赖于包括reference的libary。在os中如果没有包括这个reference的库文件,我们写的程序就不能run了
Shared Libraries
同享的库
把很多可以独自运行的文件打包成一libary,这意味着我们不需要把libary里的binary文件添加到executable文件中,在executable中的reference在运行时来调整,这样所有execuable程序都可以到same memory中去找到libary binary。
这需要一些技能,libary中的binary程序不能有任何的static变量,也不能有global变量,如果有static变量或是global变量,这个binary程序就要为每个调用他的程序供给一个单独的变量空间。这种技能通常用在多线程的程序中,一个程序可能有多个控制流。
通过 库文件的位置在virtual memory中,也可能不是一定的,也就是说库文件的位置可能经常会变更,这就要求动态库文件在任何的位置都可以运行,就是生成的代码是与运行位置有关的。(这样的代码可以通过在GCC编译时,添加-PIC(position independent code)选项失掉)。这种位置有关的代码需要elf文件格式的支撑,位置有关的代码的运行效率可能要低一点(这是需要支付的代价)
ABI - Application Binary Interface
应用程序与二进制程序中调用的标准:
ABI定义了 libary 中的函数是如何被调用,还有syscall是如何调用的。这个调用标准 包括了,参数保存在stack中还是 保存在register中,在libary中函数的进口点是放在哪里,还有其它的一些内容。
当用static linkage时,生成的可运行的程序 与kenel调用应用程序时 用的ABI标准要一样。
当用dynamic linkage时,生成的可运行的程序,与libary 中使用的ABI标准要坚持一样。
Unresolved Symbols
没有解决的符号(就是用dynamic linkage时程序中存在的reference,或是static linkage时找不到符号)
linker会运行的参加一些你不知道的reference .
如( $(V)$(LD) -o $@ $(KERN_LDFLAGS) $(KERN_OBJFILES) $(GCC_LIB) -b binary $(KERN_BINFILES) )
这些reference包括了alloca(),memset(),memcpy()还有其它的一些函数(在libgcc.a中)。
经常我们会由于没有畸形的使用tool chain或是command line配置的有问题,而没法畸形的编译出自己的os kernel。或是我们调用的一些函数在libary中没实现。在我们ld时没有用libgcc这个库文件时(包括memcpy memmove,memset,memcmp),通过会出错。
每日一道理
喜马拉雅直冲霄汉,可上面有攀爬者的旗帜;撒哈拉沙漠一望无垠,可里面有跋涉者的脚印;阿尔卑斯山壁立千仞,可其中有探险者的身影;雅鲁藏布江湍急浩荡,可其中有勇敢者的故事。
其它的一些symbols,如做除法,_udiv,求余_umode等。也是可以在libgcc库文件中找到的。如果你在ld时,missing such symbols,记住在ld时,link with libgcc.
原文位置:
http://wiki.osdev.org/How_kernel,_compiler,_and_C_library_work_together#Kerne
文章结束给大家分享下程序员的一些笑话语录:
苹果与谷歌之争就是封闭收费与自由免费思想之争。(别急着把google来膜拜哦?那可是一家公司,以赚钱为目标的公司!当年我Party就是这样把广大劳动人民吸引过来的。今天的结果你们都看到了。)
---------------------------------
原创文章 By
程序和链接
---------------------------------
Static Linking
在ld时,如果找到了obj文件中存在的reference,就会到libary中去把这个reference的binary code 添加到你的程序中去。
经过了静态链接的程序,是一个真正完全的可运行的程序,运行的时候不需要其它的东东,只需要os的kernel调用这个code就行了
静态链接中,最重要的一点:把libary中的binary 程序 添加到我们调用库函数的程序中去了。
Dynamic Linking
动态链接时,在ld时,如果我们写的code中调用了库中的代码,这里不会把库中的binary code直接添加我们的code中去,而是保留这个reference,在程序加载运行时,注意是在我们的code运行时,程序中保留的那个reference就会被链接程序链接到到libary中执行。动态链接的好处就是可以使on disk 程序非常的小,勤俭和了memory,动态链接的结果就是(shared libray),动态链接的程序是要依赖于包括reference的libary。在os中如果没有包括这个reference的库文件,我们写的程序就不能run了
Shared Libraries
同享的库
把很多可以独自运行的文件打包成一libary,这意味着我们不需要把libary里的binary文件添加到executable文件中,在executable中的reference在运行时来调整,这样所有execuable程序都可以到same memory中去找到libary binary。
这需要一些技能,libary中的binary程序不能有任何的static变量,也不能有global变量,如果有static变量或是global变量,这个binary程序就要为每个调用他的程序供给一个单独的变量空间。这种技能通常用在多线程的程序中,一个程序可能有多个控制流。
通过 库文件的位置在virtual memory中,也可能不是一定的,也就是说库文件的位置可能经常会变更,这就要求动态库文件在任何的位置都可以运行,就是生成的代码是与运行位置有关的。(这样的代码可以通过在GCC编译时,添加-PIC(position independent code)选项失掉)。这种位置有关的代码需要elf文件格式的支撑,位置有关的代码的运行效率可能要低一点(这是需要支付的代价)
ABI - Application Binary Interface
应用程序与二进制程序中调用的标准:
ABI定义了 libary 中的函数是如何被调用,还有syscall是如何调用的。这个调用标准 包括了,参数保存在stack中还是 保存在register中,在libary中函数的进口点是放在哪里,还有其它的一些内容。
当用static linkage时,生成的可运行的程序 与kenel调用应用程序时 用的ABI标准要一样。
当用dynamic linkage时,生成的可运行的程序,与libary 中使用的ABI标准要坚持一样。
Unresolved Symbols
没有解决的符号(就是用dynamic linkage时程序中存在的reference,或是static linkage时找不到符号)
linker会运行的参加一些你不知道的reference .
如( $(V)$(LD) -o $@ $(KERN_LDFLAGS) $(KERN_OBJFILES) $(GCC_LIB) -b binary $(KERN_BINFILES) )
这些reference包括了alloca(),memset(),memcpy()还有其它的一些函数(在libgcc.a中)。
经常我们会由于没有畸形的使用tool chain或是command line配置的有问题,而没法畸形的编译出自己的os kernel。或是我们调用的一些函数在libary中没实现。在我们ld时没有用libgcc这个库文件时(包括memcpy memmove,memset,memcmp),通过会出错。
每日一道理
喜马拉雅直冲霄汉,可上面有攀爬者的旗帜;撒哈拉沙漠一望无垠,可里面有跋涉者的脚印;阿尔卑斯山壁立千仞,可其中有探险者的身影;雅鲁藏布江湍急浩荡,可其中有勇敢者的故事。
其它的一些symbols,如做除法,_udiv,求余_umode等。也是可以在libgcc库文件中找到的。如果你在ld时,missing such symbols,记住在ld时,link with libgcc.
原文位置:
http://wiki.osdev.org/How_kernel,_compiler,_and_C_library_work_together#Kerne
文章结束给大家分享下程序员的一些笑话语录:
苹果与谷歌之争就是封闭收费与自由免费思想之争。(别急着把google来膜拜哦?那可是一家公司,以赚钱为目标的公司!当年我Party就是这样把广大劳动人民吸引过来的。今天的结果你们都看到了。)
---------------------------------
原创文章 By
程序和链接
---------------------------------
相关文章推荐
- Cocos2dx 学习记录 [2] 关于混合和高亮一些知识点的体会
- 关于廖雪峰yield,协程,异步的一些学习记录
- 有关于递归函数的一些学习记录(Recursion)走楼梯,递归找出最两个数的大公约数,汉诺塔问题
- 关于oracle数据库索引的一些学习记录
- 关于winpcap学习的一些链接
- 关于前端开发学习中的一些小记录1
- 20110126 学习记录:一些关于html中布局的代码 & CSS hack速查表
- 一些需要学习或有用的链接 以及学习中的小记录
- 共享库加载失败问题排查。gcc编译器生成共享库时不检查符号的依赖项。gcc编译器生成可执行程序时,会多链接一些无用的额库
- 链接,转载与库:关于程序装载入内存的一些小实验
- 【ssh2学习记录】3、关于ssh2框架整合以及hibernate的一些总结
- Cocos2dx 学习记录 [2] 关于混合和高亮一些知识点的体会
- MyBatis3 学习笔记(一) 关于第一个小程序引发的一些小异常
- 关于使用跟踪程序结果控制摄像头运动的一些记录
- 【学习】关于学习编程,大神们的一些建议(记录学习中)
- 关于位操作学习的一些记录
- 一些关于Android蓝牙的学习链接
- 关于学习过程中一些可以共享的网址--长期更新
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- 关于前端开发学习中的一些小记录