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位汇编的一些不同的更多相关文章

  1. windows下的mysql迁移到linux下

    最近做毕业设计,需要把windows下的mysql移植到linux下 曾经有过在window下移植mysql数据库的经验,只需要把msql的数据文件复制到另一台安装mysql的机器的数据存放位置,然后 ...

  2. 将Windows下的文件同步到Linux下

    需求:把Windows下的某些文件自动传送到Linux指定目录下 实现: 1. Windows下安装 WinSCP工具,并把Liunx服务器信息保存 2. 编写脚本,实现双击工具就把Windows下的 ...

  3. mac OS X Yosemite (10.10.5) 下 安装vim 7.4笔记

    摘要 前言 需求与mac OS X 自带vim版本的冲突 默认Python解释器问题 并非Mac自带python的 homebrew 1. 前言 本文为自己作死折腾的问题记录 2. 需求与mac OS ...

  4. Linux下ps命令详解 Linux下ps命令的详细使用方法

    http://www.jb51.net/LINUXjishu/56578.html Linux下的ps命令比较常用 Linux下ps命令详解Linux上进程有5种状态:1. 运行(正在运行或在运行队列 ...

  5. windows下的c语言和linux 下的c语言以及C标准库和系统API

    1.引出我们的问题? 标准c库都是一样的!大家想必都在windows下做过文件编程,在linux下也是一样的函数名,参数都一样.当时就有了疑问,因为我们非常清楚 其本质是不可能一样的,源于这是俩个操作 ...

  6. Linux下修改默认字符集--->解决Linux下Java程序种中文文件夹file.isDirectory()判断失败的问题

    一.问题描述: 一个项目中为了生成树状目录,调用了file.listFiles()方法,然后利用file.isDirectory()方法判断是否为目录,该程序在windows下运行无问题,在Linux ...

  7. Windows下war包部署到Linux下Tomcat出现的问题

    最近,将Windows下开发的war包部署到Linux下的Tomcat时报了一个错误:tomcat error in opening zip file.按理说,如果正常,当把war包复制到webapp ...

  8. windos下创建软链接,附Linux下创建软链接

    用过好多次老是忘记: 写在这里忘了就来看下 Windows下(win7) mklink /D D:\phpStudy\WWW\yii\school\teacher\web\uploads\public ...

  9. LINUX下SYN FLOOD攻击及LINUX下SYN攻防简述

    LINUX下SYN攻防战如下 (一)SYN攻击原理 SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费服务器CPU和内存资源.SYN攻击聊了能影响主机外,还可以危害路 ...

随机推荐

  1. 3.0、Android Studio构建和运行应用

    默认情况下,Android Studio可以通过简单的点击就会将新的项目部署到虚拟机或者物理设备中.在Instant Run的帮助下,你可以将更改的方法或资源文件直接推送到一个运行的app而无需构建一 ...

  2. 【并发编程】Binder运行机制的流程图

    Binder工作在Linux层面,属于一个驱动,只是这个驱动不需要硬件,或者说其操作的硬件是基于一小段内存.从线程的角度来讲,Binder驱动代码运行在内核态,客户端程序调用Binder是通过系统调用 ...

  3. <<精通iOS开发>>第14章例子代码小缺陷的修复

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 首先推荐大家看这本书,整本书逻辑非常清晰,代码如何从无到有,到 ...

  4. Centos7安装Tair及配置测试

    系统环境 Centos7 64位 外网ip 182.254.145.66 内网ip 10.105.23.114 安装位置 /usr/local/tair Tair介绍 参见官网 安装 想了半天,我还是 ...

  5. Centos6.6上源码安装Nodejs V4版本

    本来就是想在vps上装一个Ghost博客,这个博客依赖的是Nodejs,然后推荐的是V4版本.然后我就对着官网的步骤安装,发现根本没有Centos6 i386的资源了(64位的还是有的), 我只能在那 ...

  6. 定义范围中的备选方案生成、横向思维、创建WBS、工作包定义、WBS、确认范围过程和实施质量过程的关系、联合应用设计和质量功能展开QFD

  7. J2EE学习从菜鸟变大鸟之七 Servlet

    Servlet现在自己的理解是一个控制器,简单的可以理解为不同的JSP页面由用户发送过来的请求可以由Servlet控制器来控制其向下调用的方向(结合三层好理解),但它比较特殊,因为它通常会从外界接收数 ...

  8. UNIX网络编程——套接字选项(SOL_SOCKET级别)

    #include <sys/socket.h> int setsockopt( int socket, int level, int option_name,const void *opt ...

  9. SHA算法

    安全Hash函数(SHA)是使用最广泛的Hash函数.由于其他曾被广泛使用的Hash函数都被发现存在安全隐患,从2005年至今,SHA或许是仅存的Hash算法标准. SHA发展史 SHA由美国标准与技 ...

  10. C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容

    一.本文目的与说明 1. 本文目的:理清在各种继承时,构造函数.复制构造函数.赋值操作符.析构函数的执行顺序和执行内容. 2. 说明:虽然复制构造函数属于构造函数的一种,有共同的地方,但是也具有一定的 ...