zoukankan      html  css  js  c++  java
  • Linux进程下的编译

    • 在Linux下面,二进制的程序要有严格的格式,这个格式称为ELF(Executeable and Linkable Format,可执行与可链接格式),这个格式可以根据编译的结果不同,分为不同的格式。

    • 源文件.c和头文件.h最终编译成为的.o对象文件,是ELF的第一种类型,即可重定位文件(Relocatable File)。

    • 局部变量放在栈里,程序运行过程中随时分配空间,随时释放,对于.o的二进制文件,程序还未启动,可重定位文件.o里没有局部变量。

    • 对于编译好的代码和变量,将其加载到内存里时,要加载到一定位置,如函数所在的代码位置,全局变量所在的位置。但对于.o文件,不可以直接运行,这里面只是部分代码片段,.o里面的位置是不确定的,所以必须可重定位。

    • 若函数作为库文件被重用,不能以.o的形式存在,而是要形成库文件,最简单的类型是静态链接库.a文件(Archives)。

    • 在.o文件间的链接过程中,重定位起作用,链接结束后,形成的二进制文件叫可执行文件,是ELF的第二种格式。

    • 静态链接库一旦链接进去,代码和变量的部分就进行合并,因而程序运行的时候,就不依赖于这个库是否存在。但对于相同的代码段,如果被多个程序使用的话,在内存里面就有多份,一旦静态链接库更新,如果二进制执行文件不重新编译,也不随着更新。

    • 动态链接库(Shared Libraries),不仅仅是一组.o对象文件的简单归档,而是多个对象文件的重新组合,可被多个程序共享。当一个动态链接库被链接到一个程序文件中的时候,最后的程序文件并不包括动态链接库中的代码,而仅仅包括对动态链接库的引用,并且不保存动态链接库的全路径,仅仅保存动态链接库的名称。

    • 动态链接库,是ELF的第三种类型,共享对象文件.so(Shared Object)。运行时的链接动作都由动态链接器完成。

  • 相关阅读:
    计算两个时间相差几个月
    批量生成二维码
    PHP实现二维数组(或多维数组)转换成一维数组
    任意二维数组转换成一维数组
    企业微信的使用与公众号以及其它几个应用的使用方式都是一致的
    判断字符类型
    insert一个表的数据到另外一个表
    同步a表的数据到 b表
    PHP Curl Accept-Encoding: gzip乱码问题解决
    spring boot入门程序
  • 原文地址:https://www.cnblogs.com/kongzimengzixiaozhuzi/p/13233898.html
Copyright © 2011-2022 走看看