• Geek_54edc1
    2019-06-14
    readelf -s link_example.o //查看符号表
    objdump -r link_example.o //查看重定位表
    
     11
  • 有米
    2019-05-13
    Java的跨平台运行是如何做到的呢?跟本节内容有关系吗?

    作者回复: Java是通过实现不同平台上的虚拟机,然后即时翻译javac生成的中间代码来做到跨平台的。跨平台的工作被虚拟机开发人员来解决了

    
     11
  • 二星球
    2019-05-18
    老师好,就是没有操作系统,直接在硬件上运行的可执行程序,其格式应该不是pe或elf,应该是纯的机器指令吧,pe或elf格式的可执行程序是跟操作系统绑定的,经过翻译后成为纯机器指令,才能被执行,不知道这样理解对不。

    作者回复: 可以这样理解。实际机器启动加电的时候是从BIOS去读取MBR,再加载操作系统等等。

    PE和ELF是在操作系统加载之后的事情了。

    
     9
  • 一步
    2019-05-13
    老师,我曾经在linux上使用过wine,有好多window软件不能很好兼容的运行,这是为什么呢?是不是除了执行文件格式之外,还有其他的因素影响软件的运行呢?

    作者回复: 一步同学你好,当然,因为很多程序还依赖各种操作系统本身提供的动态链接库,系统调用等等。需要wine提供对应的实现,兼容格式只是万里长征第一步。

    
     7
  • Spring
    2019-05-13
    补充一下:
    ELF其实是一种文件格式的标准,ELF文件有三类:可重定向文件、可执行文件、共享目标文件。代码经过预处理、编译、汇编后形成可重定向文件,可重定向文件经过链接后生成可执行文件。
    另外我想请教一下,机器码是在哪一步形成的?

    作者回复: 简单地说,可以认为是在汇编之后变成了机器码放在了elf的代码段里。

    
     7
  • 陆离
    2019-05-23
    高级语言都是先编译成汇编语言,再汇编成机器码执行的吗?

    作者回复: 如果是编译型的语言都是这样的。

    也有通过解释器,或者虚拟机,转换成实际的机器码指令执行的。

    
     5
  • 有铭
    2019-05-13
    所以理论上,只要不涉及到windows和linux的系统api调用,理论上只要搞定了可执行文件格式这个问题,那么C程序就是二进制可移植的?

    作者回复: 除了系统调用,还要考虑是否有动态链接库的依赖等等

    
     4
  • 曾经瘦过
    2019-05-13
    mark 后面去读一读 程序员的自我修养

    作者回复: 👍这本书对于做系统开发的同学是必读书目之一。

    
     3
  • kdb_reboot
    2019-05-26
    这里(gcc -g -c add_lib.c link_example.c)需要extern int addd(int a, int b);

    作者回复: 没错,不过其实你不加入对应的申明编译和运行也是能执行的,但是会有编译器的告警。

    
     2
  • 二星球
    2019-05-13
    老师好,我有个问题,就是我可以用编程语言写一个不依赖操作系统的可执行程序,这个可执行程序不是pe格式,也不是elf的,那为什能执行呢,是不是因为这个可执行程序全是纯的cpu指令,没有其他要解析的东西?

    作者回复: 如果不是pe格式也不是elf格式,就不能执行啊。能执行是因为实际执行的不是你的程序。比如你写了一段python代码,实际执行的是python解释器,而不是你的py代码

    
     2
  • 闫循鸣
    2019-05-13
    整个elf文件都加载到内存吗,还是只加载一部分?

    作者回复: 闫循鸣同学你好,关于这一部分,可以看下一讲的程序加载

    
     2
  • 一步
    2019-05-13
    老师问一下Mac系统的可执行文件格式是什么,也是ELF吗?还是mac自己有自己一套?
     1
     2
  • Only now
    2019-05-13
    mark
    本章内容确实在链接装载与库里有更详尽的说明。

    作者回复: 👍程序员的自我修养是一本好书。这个专栏的主题是组成原理,希望能带大家入个门。更深入地要去再花时间看书哦

    
     2
  • lzhao
    2019-05-13
    上周五还在思考这个问题?这答案说来就来,及时雨宋江

    作者回复: 👍希望对大家有所帮助

    
     1
  • 程序水果宝
    2020-02-08
    为啥通过 gcc 的 -o 参数生成对应的可执行文件后,再执行objdump命令查看到的地址不是从0开始而是从6b0开始

    作者回复: 程序水果宝同学,

    objdump命令并不是从6b0开始,只是add函数的text section从6b0开始而已。你可以自己试着在本地dump出来看一下。

    ELF格式的文件有很多section,也有header部分,里面的地址本质上是一个相对的偏移量。想要对ELF格式做更深入的研究,推荐可以先花点时间看完《程序员的自我修养》这本书。

    
    
  • gogo
    2020-01-02
    不是很懂objdump 执行了一下-help命令
    objdump -help

      -lazy-bind - Display mach-o lazy binding info
      -s - Display the content of each section
      -section-headers - Display summaries of the headers for each section.
      -source - Display source inlined with disassembly. Implies disassemble object
      -t - Display the symbol table
      -weak-bind - Display mach-o weak binding info


    -t 就是符号表吧?
    -s 就是每个section的内容
    -lazy-bind 就是只有在运行的时候才会链接绑定的吗?
    -weak-bind 弱绑定 (emmm 想起了java里面的弱引用, 这个是弱绑定,不敢瞎说)

    objdump -source link-example

    link-example: file format Mach-O 64-bit x86-64

    Disassembly of section __TEXT,__text:
    __text:
    省略 地址 指令 数据

    _add:
    省略 地址 指令 数据

    _main:
    省略 地址 指令 数据

    Disassembly of section __TEXT,__stubs:
    __stubs:
    省略 地址 指令 数据

    __stub_helper:
    省略 地址 指令 数据

    -------------------
    objdump -s link-example

    link-example: file format Mach-O 64-bit x86-64

    Contents of section __text:

    ...

    Contents of section __stubs:
    ...

    Contents of section __stub_helper:
    ...

    Contents of section __cstring:
    ...

    Contents of section __nl_symbol_ptr:
    ...

    Contents of section __la_symbol_ptr:
    ...
    Contents of section __unwind_info:
    ...


    ------

    按老师说的,是有这些东西应该。但是具体看不太懂。

    嗯 -o是目标文件 不是可执行文件
    gcc -o link-example add.o main.o
    将目标文件链接之后 才能生成可执行文件
    可执行文件里面不仅仅有指令和代码,还有符号表和重定位表。 进一步学习需要看老师推荐的书。
    展开

    作者回复: gogo同学,

    你好,-t是符号表。--weak-bind 就是弱绑定,应用场景是可以为一些函数库提供默认实现,但是用弱绑定,然后在链接的时候,替换成别的实现。

    
    
  • Dana
    2019-12-30
    Linux 系统 最后可执行为的文件为 ELF
    
    
  • 陈志恒
    2019-11-28
    第一次接触跨平台这个词是来自于java,但是会造成错误的认识:带java虚拟机的才是跨平台的必备条件。这其中犯了一个局部与整体的错误,井底之蛙说的就是我!跨平台并不属于语言的特性,而是需要从这个计算机体系的角度全面的理解
    
    
  • _stuView
    2019-11-09
    链接器的图里少了一条从add_lib.o的.rel.text Section指向符号解析与重定位的线吧
    
    
  • 拯救地球好累
    2019-10-20
    ---总结---
    编译型语言的执行过程:编译-汇编-链接-装载
    同一个程序在同一台计算机上的Linux和Win中不能兼容运行的原因:可执行文件和目标文件格式的不同
    ELF文件的组成:文件头&代码段&数据段&重定位表&符号表
    
    
我们在线,来聊聊吧