C 和汇编程序实际上编译成什么? [关闭]

2023-11-30

所以我发现 C(++) 程序实际上不会编译为普通的“二进制”(我可能在这里犯了一些错误,在这种情况下我很抱歉:D),而是编译为一系列的东西(符号表) ,与操作系统相关的东西,...)但是...

  • 汇编程序是否“编译”为纯二进制文件?这意味着除了预定义字符串等资源之外,没有额外的东西。

  • 如果 C 编译为非普通二进制文件,那么小型汇编程序引导加载程序如何将指令从 HDD 复制到内存并执行它们?我的意思是,如果操作系统内核(可能是用 C 编写的)编译成与普通二进制文件不同的东西 - 引导加载程序如何处理它?

编辑:我知道汇编器不会“编译”,因为它只有你机器的指令集 - 我没有找到一个好词来形容汇编器“汇编”的内容。如果你有的话,请将其留在这里作为评论,我会更改它。


C 通常编译为汇编程序,只是因为这让可怜的编译器编写者的生活变得轻松。

汇编代码总是汇编(不是“编译”)可重定位目标代码。您可以将其视为二进制机器代码和二进制数据,但带有大量装饰和元数据。关键部分是:

  • 代码和数据出现在命名的“部分”中。

  • 可重定位目标文件可能包括以下定义labels,它指的是部分内的位置。

  • 可重定位对象文件可能包括要用其他地方定义的标签值来填充的“洞”。这种洞的正式名称是搬迁条目.

例如,如果您编译并汇编(但不链接)该程序

int main () { printf("Hello, world\n"); }

你可能会得到一个可重定位的目标文件

  • A text包含机器代码的部分main

  • 标签定义main它指向文本部分的开头

  • A rodata(只读数据)包含字符串文字字节的部分"Hello, world\n"

  • 依赖于的重定位条目printf它指向文本部分中间的调用指令中的一个“洞”。

如果您使用的是 Unix 系统,可重定位目标文件通常称为 .o 文件,如下所示hello.o,您可以使用一个名为的简单工具来探索标签定义和使用nm,您可以从一个更复杂的工具(称为objdump.

我教授一门涵盖这些主题的课程,我让学生编写汇编器和链接器,这需要几周的时间,但是当他们完成后,大多数人都可以很好地处理可重定位目标代码。这不是一件容易的事。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 和汇编程序实际上编译成什么? [关闭] 的相关文章

  • 如何将异常对象序列化为 xml 字符串

    我想要类似的东西 try code here catch Exception ex stringXML Exception toXML 这样 stringXML 的值就是
  • 沿着长数据序列在固定大小的移动窗口中查找中值

    给定一个数据序列 可能有重复项 一个固定大小的移动 窗口 从数据开始处每次迭代时移动窗口 序列 使得 1 从窗口中删除最旧的数据元素并添加新数据 元素被推入窗口 2 求每次移动时窗口内数据的中位数 以下帖子没有帮助 有效地找到随机序列的中值
  • 不能使用函数名称距离

    以下代码可以正常编译 include
  • ASP.NET Core 中 AsNoTracking 的模拟或更好的解决方法

    您如何模拟 AsNoTracking 或者是否有更好的解决方法来解决此问题 Example public class MyContext MyContextBase Constructor public MyContext DbContex
  • std::async 参数的生命周期是多少?

    看来函数的参数是通过std async分享未来的生活 include
  • 使用 CMake 对 SDL 的未定义引用

    我正在使用 SDL v1 2 15 7 和 CMake 3 2 1 开发一个项目 在 h 文件中我添加了 include
  • 如何(可移植地)在 C 和 C++ 中获取 DBL_EPSILON

    我正在 Linux AS 3 上使用 GCC 3 4 并试图找出DBL EPSILON 或者至少是一个不错的近似值 我怎样才能以编程方式获取它 在 C 中是std numeric limits
  • 对无符号 8 位整数进行左移操作 [重复]

    这个问题在这里已经有答案了 我试图理解 C C 中的移位运算符 但它们给我带来了困难 我有一个无符号 8 位整数 初始化为一个值 例如 1 uint8 t x 1 根据我的理解 它在内存中的表示方式如下 0 0 0 0 0 0 0 1 现在
  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • 是否可以获取指向装箱非托管值类型的指针?

    是否可以获取指向装箱非托管值类型的指针 而无需编写对每个支持的类型进行强制转换的大型 switch 语句 就像是 object val Contains a boxed unmanaged value such as int long by
  • memccpy 返回比 src 起始地址更低的内存地址

    我有一个学校项目 我必须重新编码memccpy 功能 我使用 2 个程序来检查我的代码是否正常工作 第一个是只有一个主程序的小程序 第二个程序是另一个学生开发的 可以找到here https github com yyang42 mouli
  • 在 C++ 中初始化指针

    可以在声明时将指针分配给值吗 像这样的东西 int p 1000 是的 您可以在声明时初始化指向值的指针 但是您不能这样做 int p 1000 是个地址运算符 并且您不能将其应用于常量 尽管如果可以 那会很有趣 尝试使用另一个变量 int
  • 本地主机和 request.Url.Authority

    我的应用程序通过 URL 中的公司标识符分隔用户 company1 app com company2 app com 我正在本地 PC 上进行测试 请求如下 company1 localhost com 但是 我的 request Url
  • 使用 C# 和 .NET Core 在 AWS Cognito 用户池中进行用户管理

    如何使用 C 和 NET Core 3 x 管理 AWS Cognito 用户池中的用户 在文档中找不到有关它的任何内容 Attilio Gelosa 的原创文章 我写这篇文章是希望对其他人有帮助 我必须阅读一页又一页的文档 并从 AWS
  • 为什么 C++20 范围不只提供管道语法?

    我知道这个问题听起来很奇怪 所以这里有一些背景信息 最近 我很失望地了解到 C 20 范围内的映射缩减并不像人们所期望的那样工作 即 const double val data transform accumulate 不起作用 你必须这样
  • 将华氏温度转换为摄氏度的 C 程序始终打印零

    我需要一些关于用 C 语言将华氏温度转换为摄氏度的程序的帮助 我的代码如下所示 include
  • std::iota 的 iota 代表什么?

    我假设 i 是增量 a 是分配 但我无法弄清楚或找到答案 而且 它看起来与非标准非常相似itoa我认为这很令人困惑 C iota is not an acronym or an initialism It is the word iota
  • C++ 项目编译为静态库,编译为动态库失败(链接器错误)。为什么?

    我有一个 VS2008 本机 C 项目 我希望将其编译为 DLL 它仅引用一个外部库 log4cplus lib 并使用其功能 当然也使用 log4cplus 的 h 文件 当我尝试将我的项目编译为静态库时 它成功了 当我尝试作为 DLL
  • 如何在您的网站中连接两个人

    有一款名为 Verbosity 的游戏 这是一款有目的的游戏 位于此链接上www gwap com 在游戏中 他们随机连接两个玩家互相玩 游戏是玩家1应该向他的搭档 玩家2 描述一个单词 而玩家2应该猜测这个单词 我正在尝试建立一个网站来执
  • C# 中的快速字符串解析

    在 C 中解析字符串最快的方法是什么 目前我只是使用字符串索引 string index 并且代码运行合理 但我忍不住认为索引访问器所做的连续范围检查必须添加一些东西 所以 我想知道我应该考虑哪些技术来增强它 这些是我最初的想法 问题 使用

随机推荐