为什么在不同机器上编译不同的程序entry point都是一样的?

来源:1-4 Go 程序是怎么跑起来的

拧壶冲

2021-05-24 10:58:11

曹大老师,在使用`readelf`的时候有一个疑惑,就是无论编译上面程序,他们的`readelf` 查看的entry point address为什么都一样?而且居然在不同的机器上,居然也都是`0x455780`。

为什么entry point都是一样的呢?这是virtual memory management的原因吗?但是我想不同的机器上内存使用情况都不一样吧。`0x455780`是不是有什么特定含义或者用途?



写回答

1回答

Xargin

2021-05-24

地址都一样大概有下面一些方面的原因:

  1. reproducible builds 是编译里的一个概念,就是说只要我们的源代码相同,平台一致(如,都是 linux amd64),Go 版本一致,那么编译出来的二进制文件也应该是完全一致的,这个概念你可以看看https://en.wikipedia.org/wiki/Reproducible_builds

  2. 从源代码到二进制,中间要经过 编译-> 链接两个过程,链接过程给文件内的符号分配的都是虚拟地址,二进制文件完全一致的情况下,虚拟地址也应该是一致的。

0

Go高级工程师实战营

慕课网与 GoCN 社区官方联手打造,定义行业Go高级人才培养标准,4个月,快速晋升为P6+/D7级高级人才。

458 学习 · 266 问题

查看课程