LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1015|回复: 3

sigreturn地址是什么?

[复制链接]
发表于 2006-2-21 14:03:56 | 显示全部楼层 |阅读模式
当程序运行于signal handle中,栈中会保存sigreturn的地址,
可通过分析栈中是否有sigreturn的地址,判断程序是否运行于signal handle中。

请问:1。sigreturn的地址是什么?
      2。如何分析栈?对栈每4个字节进行比较?
      3。有没有别的办法?
 楼主| 发表于 2006-2-22 10:39:18 | 显示全部楼层
extern void __user __kernel_sigreturn;
unsigned long sigret_addr = &__kernel_sigreturn;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-22 10:39:18 | 显示全部楼层
extern void __user __kernel_sigreturn;
unsigned long sigret_addr = &__kernel_sigreturn;
回复 支持 反对

使用道具 举报

发表于 2006-3-4 09:08:35 | 显示全部楼层
这种通过判断用户堆栈中是否存在sigreturn地址的方法来判断是否在信号处理函数的方法实在不太合适。纵览Linux内核各个不同的体系结构的实现可以看到,体系结构不同sigreturn的地址也不同,而且根据posix规定,信号返回的处理函数可以由用户自行制定,用户可以设置sigretore之类的函数来更改sigreturn的地址。还有sighandler的函数原型也不确定,根据在登记信号处理函数时设置的标识不同,信号处理函数有时只需要一个参数,有时需要3个参数。体系结构不同、函数原型不同和编译器的C语言调用规则不同导致信号处理函数的堆栈也不同。这样根据sigreturn来判断是否在信号处理函数中,就会导致代码非常缺乏可移植性。同时也加大了代码的难度和可理解性。想想肯定有其它更好的方法代替。

camelguo@gmail.com

http://camelguo1978.blogcn.com

^_^
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表