【问题标题】:What's difference between ".SECTION .data" and just ".data" in GNU GAS?GNU GAS 中的“.SECTION .data”和“.data”有什么区别?
【发布时间】:2014-02-06 15:14:02
【问题描述】:

似乎两者都在工作。

但是.SECTION 是什么意思?为什么是大写的?

我在 gdb 'info file' 或 'disassemble main' 中找不到任何区别

【问题讨论】:

    标签: assembly gnu-assembler


    【解决方案1】:

    为什么是大写的?

    汇编指令似乎不区分大小写,基于:

    • 快速编译测试
    • docs saying "名称的其余部分是字母,通常小写。"
    • 我对@9​​87654322@源的解释
      • 如果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,.sectionconfig/obj-elf.c#obj_elf_section() 处理

    .dataread.c#s_data 处理。

    TODO:如果.section .data 不带任何参数,是否与.data 相同,则从源代码得出结论

    【讨论】:

      【解决方案2】:

      .section 似乎是用于定义具有名称和/或标志的部分的指令。 .data 是初始化数据的预定义部分。

      这只是一个猜测,但我认为 .section .data 可能是一个接一个的两个部分:第一个未命名,没有标志也没有内容,另一个是 .data-section。

      【讨论】:

      • 根据objdump.section .data 创建一个名为.data 的单独部分。
      猜你喜欢
      • 2018-06-18
      • 2020-12-03
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 2016-03-26
      • 1970-01-01
      相关资源
      最近更新 更多