免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Gnixfeng
打印 上一主题 下一主题

[其它] 用汇编语言写的程序运行出现Segmentation fault问题 [复制链接]

论坛徽章:
1
处女座
日期:2014-11-29 14:47:43
11 [报告]
发表于 2014-04-21 22:36 |只看该作者
回复 9# daxiguagg


    还有我在调试另一个程序的时候出现这个错误
(gdb) b *_start
Breakpoint 1 at 0x3f01d8c
(gdb) r
Starting program: /home/feng/workspace/programming/Assembly/math/a.out
Warning:
Cannot insert breakpoint 1.
Error accessing memory address 0x3f01d8c: 输入/输出错误.
网上查了下,貌似没有什么好的解决方法

论坛徽章:
1
15-16赛季CBA联赛之辽宁
日期:2016-07-06 16:53:09
12 [报告]
发表于 2014-04-22 07:06 |只看该作者
本帖最后由 daxiguagg 于 2014-04-22 07:19 编辑

hello.s

  1. .code32
  2. .section .data
  3.     output:.asciz "hello world.\n"
  4.     pidstr:.asciz "pid=%d\n"
  5. .section .text
  6. .globl _start
  7. _start:
  8.     pushl $output
  9.     call printf
  10.     call getpid
  11.     pushl %eax
  12.     pushl $pidstr
  13.     call printf
  14.     pushl $10000
  15.     call sleep
  16.     pushl $0
  17.     call exit
复制代码
这样编译的,没发现问题,一切正常。
[kkk@localhost as]$ gcc hello.s -nostartfiles -o hello -m32
[kkk@localhost as]$ ./hello
hello world.
pid=2700
[kkk@localhost as]$

论坛徽章:
1
处女座
日期:2014-11-29 14:47:43
13 [报告]
发表于 2014-04-22 20:07 |只看该作者
回复 12# daxiguagg
这个程序在我这里链接时出问题,难道是我的环境问题?
[feng@www Assembly]$ gcc hh.s -nostartfiles -o hh -m32
/usr/bin/ld: skipping incompatible /usr/lib64/libc.so when searching for -lc
/usr/bin/ld: cannot find -lc
collect2: ld 返回 1



   

论坛徽章:
1
处女座
日期:2014-11-29 14:47:43
14 [报告]
发表于 2014-04-22 20:38 |只看该作者
回复 12# daxiguagg
我的用C写的hello world程序汇编出来是这样子的。
  1. .globl string
  2.         .section        .rodata
  3. .LC0:
  4.         .string        "hello world!\n"
  5.         .data
  6.         .align 8
  7.         .type        string, @object
  8.         .size        string, 8
  9. string:
  10.         .quad        .LC0
  11.         .text
  12. .globl main
  13.         .type        main, @function
  14. main:
  15. .LFB0:
  16.         .cfi_startproc
  17.         pushq        %rbp
  18.         .cfi_def_cfa_offset 16
  19.         .cfi_offset 6, -16
  20.         movq        %rsp, %rbp
  21.         .cfi_def_cfa_register 6
  22.         subq        $16, %rsp
  23.         movl        %edi, -4(%rbp)
  24.         movq        %rsi, -16(%rbp)
  25.         movq        string(%rip), %rax
  26.         movq        %rax, %rdi
  27.         movl        $0, %eax
  28.         call        printf
  29.         movl        $0, %eax
  30.         leave
  31.         .cfi_def_cfa 7, 8
  32.         ret
  33.         .cfi_endproc
  34. .LFE0:
  35.         .size        main, .-main
  36.         .ident        "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-4)"
  37.         .section        .note.GNU-stack,"",@progbits
复制代码

论坛徽章:
1
处女座
日期:2014-11-29 14:47:43
15 [报告]
发表于 2014-04-22 20:46 |只看该作者
回复 12# daxiguagg
如果使用as和ld将上面汇编出来的代码进行汇编和链接的话会出现下面的错误
[feng@www Assembly]$ as h.s -o h.o
[feng@www Assembly]$ ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -lc h.o
[feng@www Assembly]$ ./a.out
hello world!
段错误 (core dumped)


   

论坛徽章:
1
15-16赛季CBA联赛之辽宁
日期:2016-07-06 16:53:09
16 [报告]
发表于 2014-04-23 08:52 |只看该作者

  1. 1:.code32 这是说明是32位程序吗?
  2. [kkk@localhost as]$ as -o hello.o hello.s
  3. [kkk@localhost as]$ ld -dynamic-linker /lib/ld-linux.so.2 -lc hello.o -o hello  //那为什么还要去连接64的,改成这样也没问题。
  4. [kkk@localhost as]$ ./hello
  5. hello world.
  6. pid=2546




  7. 2:你C写的hello world程序反汇编出来看有rax,rbp  
  8. 寄存器r开头的是64位的,64位传递参数前几个参数不是通过栈,是寄存器,具体查一查楼。

  9. pushl $output //所以不能用pushl哦,应该放在寄存器里,64位传递参数前几个参数不是通过栈,是寄存器,具体查一查楼。
  10. call printf
复制代码

论坛徽章:
1
15-16赛季CBA联赛之辽宁
日期:2016-07-06 16:53:09
17 [报告]
发表于 2014-04-23 09:30 |只看该作者
pushl $output //所以不能用pushl哦,应该放在寄存器里,64位传递参数前几个参数不是通过栈,是寄存器,具体查一查楼。
call printf
或者改成这样试试呢,没64位环境,不太清楚。
movq $output,%rdi
call printf

论坛徽章:
1
处女座
日期:2014-11-29 14:47:43
18 [报告]
发表于 2014-04-23 12:04 |只看该作者
回复 17# daxiguagg

这个试过,不成,也会出现同样的错误

   

论坛徽章:
1
处女座
日期:2014-11-29 14:47:43
19 [报告]
发表于 2014-04-23 12:06 |只看该作者
回复 16# daxiguagg


    这里连接64位是我as和ld我用C汇编出来的代码的,就是14楼的代码。用gcc汇编出来的代码那as和ld重新汇编和连接也会出错。。。

论坛徽章:
1
15-16赛季CBA联赛之辽宁
日期:2016-07-06 16:53:09
20 [报告]
发表于 2014-04-23 12:59 |只看该作者
我说的是1楼的代码,改成

  1. .code32
  2. .section .data
  3. output:.asciz "hello world \n"
  4. .section .text
  5. .globl _start
  6. _start:
  7. movq $output,%rdi
  8. call printf
  9. movq $0,%rdi
  10. call exit

  11. 然后按照你编译的方式试
  12. [feng@www Assembly]$ as h.s -o h.o
  13. [feng@www Assembly]$ ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -lc h.o
  14. [feng@www Assembly]$ ./a.out
复制代码
我这里没有64位环境,如果还是不行,也会出现同样的错误,那就不知道楼。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP