码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 程序编译过程 & ELF格式


    代码的编译过程

    ELF文件的头是用于描述整个文件的,这个文件格式在内核中有定义 struct elf64_hlr。

    1. 可重定位文件 *.o

    2. 可执行文件 *

    3. 共享对象文件(shared object) *.so

    1. gcc -c a.c (输出是 a.o) 可重定位(ELF第一种格式)
    2. gcc a.c (输出是 a.out) 可执行 (ELF第二种格式)

     .text 代码

    .data 初始化的全局变量

    .rodata 只读数据,字符串常量,const变量

    .bss 未初始化的全局变量(运行时置0)

    .symtab 符号表(函数和变量)

    .strtab 字符串表,字符串常量和变量名

    NOTE: 局部变量是运行时在stack里。这个文件是编译时。

    我们刚才说了可重定位,为啥叫可重定位呢?我们可以想象一下,这
    个编译好的代码和变量,将来加载到内存里面的时候,都是要加载到
    一定位置的。比如说,调用一个函数,其实就是跳到这个函数所在的
    代码位置执行;再比如修改一个全局变量,也是要到变量的位置那里
    去修改。但是现在这个时候,还是.o文件,不是一个可以直接运行的
    程序,这里面只是部分代码片段。

    假设我的场景是 func.c   main.c

    那么在main.c里面调用了func这个函数,但这个函数在另一个.o里面,main.o根本不知道这个被调用函数的位置,只好在 rel.text里标注,这个func是需要重定位的。

    1. gcc -c func.c
    2. gcc -c main.c
    3. ar r func.a func.o
    4. gcc -o chun main.o -L. -lfunc

    -L表示在当前目录下找.a文件,-lfunc会自动补全文件名,比如加前缀lib,后缀.a,变成libfunc.a,找到这个.a文件后,将里面的func.o取出来,和main.o做一个链接,形成二进制执行文件chun。

    在ELF的头里面,有一项e_entry,也就是虚拟地址,是这个程序运行的入口,可以用readelf -h 查看头

     动态链接

    1. gcc -c main.c
    2. gcc -c func.c -fpic # -fpic (position independent code)
    3. gcc func.o -shared -o libfunc.so
    4. gcc -o main main.o -L. -lfunc
    5. ./main # error loading shared libraries: libfunc.so no such file or directory
    6. cp xxx.so /usr/lib
    7. export LD_LIBRARY_PATH=:/home/chun/lib
    8. ./main
    9. ldd main # find related dynamic so


     

    linux默认使用的是动态链接,使用 gcc main.c -o out -static 使用-static 可能会因为没有安装静态库而报错

    1. apt-get install glibc-static
    2. libc.so
    3. -lc
    4. cd  /usr/lib & ls | grep libc.so

  • 相关阅读:
    揭秘消费者需求:群狼调研助您把握市场先机
    17【JDBC基本操作】
    十一、对象的新增方法
    OpenAI (ChatGPT)中国免费试用地址
    Hive经典面试题(三)——间隔连续问题
    微软修改 MIT 项目原作者版权声明引发争议;白宫为提高开源安全性邀请软件行业者座谈;Ruby 3.1.0 发布 | 开源日报
    为什么别人年薪30W+?同样为测试人,“我“的测试之路...
    图学习【参考资料2】-知识补充与node2vec代码注解
    【脑机接口】POINT疗法或将为卒中后失语患者带来新希望!
    Dockerfile设置时区失效
  • 原文地址:https://blog.csdn.net/Chunying27/article/details/127567474
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号