• (旧事重提) gcc的那些事


    旧事

    gcc 编译 汇编 链接 => https://www.cnblogs.com/develon/p/9690641.html

    32位与64位应用程序

    要为不同平台交叉编译, 安装gcc-multilib即可.

    apt install -y gcc-multilib
    

    接下来, 通过-m32-m64选项即可控制gcc生成对应平台构件.

    汇编中的可重定位代码位置无关代码(PIC)

    我们知道应用程序的产生经过以下阶段:

    cpp预处理(产物:处理过头文件和宏定义的.i源码) => gcc -S编译(产物:.s汇编代码) => as汇编(产物:obj文件) => ld链接(产物:二进制应用程序)
    

    在编译的这个过程中, 可以生成可重定位代码、位置无关代码两种选择, 分别用于动态和静态链接应用程序.
    要生成共享库, 必须使用位置无关代码, 可以这么理解:

    位置无关代码采用PLT技术, 将依赖的外部符号地址申请保存在一个全局对象偏移表中(GOT), 由动态链接器在加载动态库时填充该表, 实现动态加载符号.

    可重定位代码将依赖的外部符号地址留白, 由链接时直接定位.

    gcc -S命令默认生成可重定位代码, 可以使用-fPIE-fPIC指定生成位置无关代码.

    下面是一份两者的汇编代码差异比较:

    如果要制作共享库(-shared), 则必须使用PLT技术.

    END

  • 相关阅读:
    this指针是什么?
    C++多态实现原理
    面试题2:实现Singleton模式
    面试题1:赋值运算符函数
    1.Two Sum
    朴素贝叶斯
    K近邻法
    感知机
    数据类型、用户交互、赋值运算
    蓝牙技术概述
  • 原文地址:https://www.cnblogs.com/develon/p/13586842.html
Copyright © 2020-2023  润新知