.bss部分生成段错误

时间:2014-07-06 17:22:27

标签: assembly gas

我正在使用Jon Bartlett的“从头开始编程”来学习汇编程序。我的环境是Linux上的x86-64。

我的档案是:

.code32

.section .data

.section .text

# if I uncomment these lines, compile, I get a segfault
#.section .bss
#       .lcomm buff, 500

.globl _start

_start:
        pushl $97
        call toUppercase
        addl $4,%esp

        movl %eax, %ebx
exit:
        movl $1, %eax
        int $0x80


# args: ch
#       ch -- character to upper case
#
# ret:  uppercase version of ch, untouched if not a character
.type toUppercase,@function
toUppercase:
        pushl %ebp
        movl %esp, %ebp
        movl 8(%ebp),%eax
        cmpl $97, %eax
        jl toUppercase_return
        cmpl $122, %eax
        jg toUppercase_return
        subl $32, %eax
toUppercase_return:
        movl %ebp, %esp
        popl %ebp
        ret

我使用

编译
gcc -m32 -g file.s -o file

如果我取消注释.section .bss周围文件中的行,运行程序时会出现段错误,否则运行正常。此外,如果我取消注释所述行,即使它编译和链接,我也无法再在gdbtui中打开该程序。注释掉,它在gdbtui中打开就好了。

我终于在.text之前移动了.bss,它在编译和工作时同时加载到调试器中。所以我的问题已成为,为什么必须在.text部分之前出现.text部分才能避免这个问题?

1 个答案:

答案 0 :(得分:1)

.section .bss会覆盖前.section .text。以下每个代码 将被解释为.BSS数据而不是.TEXT代码。您应该将.bss-block放在不会打扰其他部分的地方,例如:到剧本的最后。