当前位置:  开发笔记 > 运维 > 正文

无法使用ld - Mac OS X链接目标文件

如何解决《无法使用ld-MacOSX链接目标文件》经验,为你挑选了1个好方法。

获取程序链接是很容易的部分:

更改_startstart

$ nasm -f macho exit.asm

$ ld -arch i386 -o exiter exit.o

问题是,exit.asm呼吁在i386的Linux exit()系统调用(EAX = 1),程序将按预期在OS X与零个状态退出

系统调用

一个系统调用是内核的请求.与之exit()不同sqrt(),它必须向其实现中具有更高权限的软件组件发出请求,因为它终止正在运行的程序.应用无法自行创建或终止进程.系统调用为应用程序提供了一种让内核代表他们执行操作的方法.

制作系统调用是这样的:

应用程序通过将数据放入CPU寄存器(或寄存器指向的存储器)来描述他们想要执行的操作,例如

该值1EAX是系统调用号exit.

该值0EBX(EBX被清零xor)是第一个参数到系统调用,退出状态.

应用程序发出一条指令,使控件转移到内核,例如

int 80 在i386上

sycall 在x86-64上

svc 在ARMv7上的Thumb模式下

内核检查请求并决定执行或拒绝它.

内核将控制权转移回app,返回值在商定的位置,例如i386上的EAX.

Linux和OS X都void exit(int)为C程序提供了一个函数,但是没有就如何向内核描述这个请求的细节达成一致.代码exit.asm_exit()函数的实现处于同一级别libc.

即使在运行Linux的不同体系结构之间,系统调用号和调用约定也不同.例如,在x86-64 Linux上,exit(0)更常见的是这样发出:

xor rdi, rdi
mov al, 60
syscall

您可以通过拆解看到这个_exit/lib64/libc.so.6.

我们不能从libc调用exit()而不是吗?

您可以.但你必须将程序与libc.链接exit.asm上面的区别是:

$ cc -m32 -nostdlib exit.o -o exiter

出口libc.asm

extern exit
global main
main:
push 0
call exit

必须与以下内容联系:

$ cc -m32 exit-libc.o -o exit-libc

试试这个,看一下文件大小.



1> scottt..:

获取程序链接是很容易的部分:

更改_startstart

$ nasm -f macho exit.asm

$ ld -arch i386 -o exiter exit.o

问题是,exit.asm呼吁在i386的Linux exit()系统调用(EAX = 1),程序将按预期在OS X与零个状态退出

系统调用

一个系统调用是内核的请求.与之exit()不同sqrt(),它必须向其实现中具有更高权限的软件组件发出请求,因为它终止正在运行的程序.应用无法自行创建或终止进程.系统调用为应用程序提供了一种让内核代表他们执行操作的方法.

制作系统调用是这样的:

应用程序通过将数据放入CPU寄存器(或寄存器指向的存储器)来描述他们想要执行的操作,例如

该值1EAX是系统调用号exit.

该值0EBX(EBX被清零xor)是第一个参数到系统调用,退出状态.

应用程序发出一条指令,使控件转移到内核,例如

int 80 在i386上

sycall 在x86-64上

svc 在ARMv7上的Thumb模式下

内核检查请求并决定执行或拒绝它.

内核将控制权转移回app,返回值在商定的位置,例如i386上的EAX.

Linux和OS X都void exit(int)为C程序提供了一个函数,但是没有就如何向内核描述这个请求的细节达成一致.代码exit.asm_exit()函数的实现处于同一级别libc.

即使在运行Linux的不同体系结构之间,系统调用号和调用约定也不同.例如,在x86-64 Linux上,exit(0)更常见的是这样发出:

xor rdi, rdi
mov al, 60
syscall

您可以通过拆解看到这个_exit/lib64/libc.so.6.

我们不能从libc调用exit()而不是吗?

您可以.但你必须将程序与libc.链接exit.asm上面的区别是:

$ cc -m32 -nostdlib exit.o -o exiter

出口libc.asm

extern exit
global main
main:
push 0
call exit

必须与以下内容联系:

$ cc -m32 exit-libc.o -o exit-libc

试试这个,看一下文件大小.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有