gcc - 为什么在 GCC 编译的代码中,在 ret 或 jmp 之后会发现一些从未调用过的指令 nopl、nopw?
问题描述
当我使用 gcc - (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0 编译代码时 - 我在编译的代码中发现一些/所有函数末尾或绝对 jmp 之后的一些未使用的代码行。
结果似乎是对齐代码,但是:为什么不简单地使用一些 0 或 NOP?
我找到的未使用的代码行类似于我插入的以下代码行<==
:
134d: eb b7 jmp 1306 <msb32+0x16> 134f: 90 nop <== 1350: b8 ff ff ff ff mov $0xffffffff,%eax 1355: c3 retq 1356: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) <== 135d: 00 00 00 0000000000001360 <object_key_compare_serials>: 1360: 48 8b 07 mov (%rdi),%rax
12fa: 74 44 je 1340 <msb32+0x50> [...] 1338: c3 retq 1339: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) <== 1340: c1 e7 10 shl $0x10,%edi
解决方案
推荐阅读
- java - 已弃用的新 Double(double) 的替代方案
- java - 将用户输入文本复制到输出文本文件(java)
- python - python解析来自eurostat sdmx的xml文件
- file - base64 到 java6 中的文件,数据长于 65000
- java - 在改造 http post 请求中设置标头
- sharepoint-2013 - 如何在 2013 年创建工作流以在一个月内发送多封电子邮件
- c - 为什么要使用二维结构数组?
- domain-driven-design - DDD 域实体与持久性实体
- python - Tkinter:为什么矩形在被移动的蓝色触摸时仍然保持黄色?
- java - 如何返回接口对象?