Mac OS X下64位汇编与Linux下64位汇编的一些不同
1 首先系统调用号大大的不同;mac64和linux32的系统调用号也不同(虽然局部可能有相同)
2 mac64的系统调用号在:
/usr/include/sys/syscall.h
可以查到,但是调用的时候其值要加上0x2000000,可以写一个宏处理:
%define mk64 0x2000000+
使用方式如下:
mov rax,mk64 1 ;exit NO
mov rdi,0 ;error_code
syscall
3 如果在mac64下汇编要与C库相链接,所有extern符号名前要加下划线,包括入口点main:
extern _strerror
extern _printf
global _main
_main:
而linux64下汇编和C库链接的时候必须去掉符号前的下划线。
4 mac里的PIE(参考:http://blog.csdn.net/mydo/article/details/44906109),在直接使用绝对地址时会发出警告,如想去除警告,必须使用相对地址:
;mov rbx,addr
;上一条指令要换成下一条
lea rbx,[rel addr]
mov rsi,[rbx]
5 mac64下不允许将值赋到32位的绝对地址里去,比如以下指令出错:
mov [addr],rax
需要强制声明为64位地址或者改用相对地址:
mov [qword addr],rax ;ok
mov [rel addr],rax ;ok too
但linux64下无此限制。
6 mac64和linux64对系统调用的C库包装有所不同,尤其是处理系统调用返回值的时候;比如mmap调用,linux64 C库貌似不检查参数,而是依据syscall自身检查;而mac64在调用前会检查参数,如果参数有误,根本不会进行系统调用,直接设置errno,然后返回。再拿mmap来说,如果在mmap C库函数上设断点,那么在经过N次的fast_syscall_stub之后:
-> 0x7fff8c4fc3b5 <+277>: callq 0x7fff8c4fd9e0 ; _dyld_fast_stub_entry(void*, long)
才会进入断点,所以要在fast_syscall_stub上设置条件断点,忽略前面N次的捕获(我测试的程序时或略前面28次),然后会进入kernel动态库中的mmap函数:
libsystem_kernel.dylib`mmap:
-> 0x7fff8ad05a96 <+0>: pushq %rbp
0x7fff8ad05a97 <+1>: movq %rsp, %rbp
0x7fff8ad05a9a <+4>: pushq %r15
0x7fff8ad05a9c <+6>: pushq %r14
0x7fff8ad05a9e <+8>: pushq %r12
0x7fff8ad05aa0 <+10>: pushq %rbx
0x7fff8ad05aa1 <+11>: movl %r8d, %r15d
0x7fff8ad05aa4 <+14>: movq %rsi, %r14
其对传入mmap的参数进行了检查,如果发现参数错误,不会调用真正的__mmap函数,而是设置错误码,然后根据不同的错误类型跳至对应的C库错误处理函数:
0x7fff8ad05b11 <+123>: movl $0x16, %edi
0x7fff8ad05b16 <+128>: callq 0x7fff8ad03c53 ; cerror_nocancel
下面是cerror_nocancel函数的反汇编:
libsystem_kernel.dylib`cerror_nocancel:
-> 0x7fff8ad03c53 <+0>: movl %edi, -0x14a629d9(%rip) ; errno
0x7fff8ad03c59 <+6>: movq %gs:0x8, %rax
0x7fff8ad03c62 <+15>: testq %rax, %rax
0x7fff8ad03c65 <+18>: je 0x7fff8ad03c69 ; <+22>
0x7fff8ad03c67 <+20>: movl %edi, (%rax)
0x7fff8ad03c69 <+22>: movq $-0x1, %rax
0x7fff8ad03c70 <+29>: movq $-0x1, %rdx
0x7fff8ad03c77 <+36>: retq
而且最为关键的一点是,貌似mac64直接将系统调用错误码通过rax返回,而不像linux64那样返回的是错误码的补码。所以博文linux64汇编调用mmap的例子(博文链接:http://blog.csdn.net/mydo/article/details/45007989)里,syscall返回后的代码必须改写为如下代码:
;syscall for mmap
syscall
cmp rax,0xfff
ja next
push rax
mov [rel errno],rax
pop rax
or rax,-1
7 暂时想到这么多不同点,未完待续
Mac OS X下64位汇编与Linux下64位汇编的一些不同的更多相关文章
- windows下的mysql迁移到linux下
最近做毕业设计,需要把windows下的mysql移植到linux下 曾经有过在window下移植mysql数据库的经验,只需要把msql的数据文件复制到另一台安装mysql的机器的数据存放位置,然后 ...
- 将Windows下的文件同步到Linux下
需求:把Windows下的某些文件自动传送到Linux指定目录下 实现: 1. Windows下安装 WinSCP工具,并把Liunx服务器信息保存 2. 编写脚本,实现双击工具就把Windows下的 ...
- mac OS X Yosemite (10.10.5) 下 安装vim 7.4笔记
摘要 前言 需求与mac OS X 自带vim版本的冲突 默认Python解释器问题 并非Mac自带python的 homebrew 1. 前言 本文为自己作死折腾的问题记录 2. 需求与mac OS ...
- Linux下ps命令详解 Linux下ps命令的详细使用方法
http://www.jb51.net/LINUXjishu/56578.html Linux下的ps命令比较常用 Linux下ps命令详解Linux上进程有5种状态:1. 运行(正在运行或在运行队列 ...
- windows下的c语言和linux 下的c语言以及C标准库和系统API
1.引出我们的问题? 标准c库都是一样的!大家想必都在windows下做过文件编程,在linux下也是一样的函数名,参数都一样.当时就有了疑问,因为我们非常清楚 其本质是不可能一样的,源于这是俩个操作 ...
- Linux下修改默认字符集--->解决Linux下Java程序种中文文件夹file.isDirectory()判断失败的问题
一.问题描述: 一个项目中为了生成树状目录,调用了file.listFiles()方法,然后利用file.isDirectory()方法判断是否为目录,该程序在windows下运行无问题,在Linux ...
- Windows下war包部署到Linux下Tomcat出现的问题
最近,将Windows下开发的war包部署到Linux下的Tomcat时报了一个错误:tomcat error in opening zip file.按理说,如果正常,当把war包复制到webapp ...
- windos下创建软链接,附Linux下创建软链接
用过好多次老是忘记: 写在这里忘了就来看下 Windows下(win7) mklink /D D:\phpStudy\WWW\yii\school\teacher\web\uploads\public ...
- LINUX下SYN FLOOD攻击及LINUX下SYN攻防简述
LINUX下SYN攻防战如下 (一)SYN攻击原理 SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费服务器CPU和内存资源.SYN攻击聊了能影响主机外,还可以危害路 ...
随机推荐
- java中遍历map的几种方法介绍
喜欢用Java写程序的朋友都知道,我们常用的一种数据结构map中存储的是键值对,我们一般存储的方式是: map.put(key, value); 而提取相应键的值用的方法是: map.ge ...
- I/O操作之概述与导读
I/O流可以表示很多不同种类的输入源和输出目的地,包括简单的字节流,基本数据(int.boolean.double等),本地化的字符,以及对象.一些流只是简单地传递数据,还有一些流可以操作和转换数据 ...
- 套接字输入流——InputStream
输入缓冲装置里面必须要包含读取字符的通道,否则就谈不上缓冲了,这个通道就是InputStream,它属于jdk中java.io包的类,有了它我们就可以从源头读取字符,它的来源可以有多种多样,这里主要探 ...
- 《java入门第一季》之HashSet存储自定义对象问题以及注意事项
上一篇http://blog.csdn.net/qq_32059827/article/details/51578158 写到存储字符串类型的时候出现了无序,而且这个无序不是随机那种无序,它是有一定存 ...
- 【Unity Shaders】Transparency —— 使用alpha通道创建透明效果
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- java linux 项目经常无故被关闭 进程无故消息
布了几个项目.居然天天会自动的挂掉.急了.花时间解决了一下.总结方案如下: 1.磁盘满了.这大家都懂,清一下 2.tomcat在关闭的或是重启的时候,常常后台进程没有被关闭.需要用ps aux|gre ...
- mysql5.6升级到5.7后Sequel Pro无法连接解决
因为装ntop,brew自动升级了本地的Mysql,结果升级完成之后,使用Sequel Pro连接总是报错,使用mysql 命令行工具就没有问题. OSX版本 10.11.5 Mysql版本 5.6 ...
- 基于xml 实现动态加载权限功能树列表---EFSFrame企业级开发架构
在学习EFSFrame框架的过程中,感触最深的就是通过xml来实现前台与后台数据的交互,页面设计灵活,不用管后台如何写的,前台与后台的交互唯一的交互通道都是xml,在我们需要添加页面.添加规定的格式的 ...
- Android实训案例(九)——答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程
Android实训案例(九)--答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程 项目也是偷师的,决心研究一下数据库.所以写的还是很详细的,各位看官,耐着性子看完,实现结果不重要 ...
- 工作中常用的Linux命令
1.从其他机器拷贝文件夹 格式: scp -r 文件夹名 用户名@机器名:/路径 范例: scp -rsearch work@zjm-testing-ps23.zjm.baidu.com:/home/ ...