【发布时间】:2014-02-06 15:14:02
【问题描述】:
似乎两者都在工作。
但是.SECTION 是什么意思?为什么是大写的?
我在 gdb 'info file' 或 'disassemble main' 中找不到任何区别
【问题讨论】:
似乎两者都在工作。
但是.SECTION 是什么意思?为什么是大写的?
我在 gdb 'info file' 或 'disassemble main' 中找不到任何区别
【问题讨论】:
为什么是大写的?
汇编指令似乎不区分大小写,基于:
TC_CASE_SENSITIVE 未定义,则在指令和指令上都使用TOLOWER
git grep 所说的所有拱门都是这种情况,除了 binutils 2.25 中的metag 现在是 .data 与 .section .data。
文档
docs for .section 这么说:
该指令仅适用于实际支持任意命名部分的目标;例如,在 a.out 目标上,它不被接受,即使是标准的 a.out 部分名称。
所以它的可移植性和可配置性较差,因为您可以将自定义标志传递给它以使用参数控制部分属性
.section name [, "flags"[, @type[,flag_specific_arguments]]]
实证检验
对 GAS 2.24 ELF Linux x86-64 的快速测试表明,对于简单的输入,它们给出相同的输出:
a.S:
.data
i: .int 1
b.S:
.section .data
i: .int 1
比较:
as -o a.o a.S
as -o b.o b.S
cmp a.o b.o
echo $?
源代码
对于 ELF,.section 由 config/obj-elf.c#obj_elf_section() 处理
.data 由read.c#s_data 处理。
TODO:如果.section .data 不带任何参数,是否与.data 相同,则从源代码得出结论
【讨论】:
.section 似乎是用于定义具有名称和/或标志的部分的指令。 .data 是初始化数据的预定义部分。
这只是一个猜测,但我认为 .section .data 可能是一个接一个的两个部分:第一个未命名,没有标志也没有内容,另一个是 .data-section。
【讨论】:
objdump,.section .data 创建一个名为.data 的单独部分。