MacOS汇编语言入门

前言

研究汇编语言,不是用它来开发软件,而是更好地了解上层编程语言和它之间的映射关系,了解内存管理,了解程序加载,也了解编译器和操作系统、可执行文件这些基础。

关于汇编语言

首先,我们通常研究的汇编语言并不是直接工作在裸机上的,它和高级语言一样,得运行在操作系统之上,也是被操作系统加载,也是要调用系统提供的“例程”,或者叫系统调用。

硬件的例程,BIOS中断程序,DOS中断/Linux中断,汇编语言脱离不了这些,从某种意义上说,汇编语言和高级语言一样,也是基于操作系统提供的各种函数、库进行编程。并不是完全基于CPU的指令进行编程的。一样的要创建变量,分配内存才能工作。

学习汇编语言的意义?

  • 搞编译器或虚拟机研究或开发
  • 理解上层语言在内存中的样子,弄懂到底是怎么执行的,从而帮助你写出更佳的代码
  • 搞各种逆向,破解
  • 性能调优

这就是我能想到的几个场景。

Linux汇编语言

ldd命令查看可执行文件依赖了哪些动态库,以及程序运行时,这些动态库的位置。
LD_LIBRARY_PATH

MacOS上的汇编语言

动态库基础

  • Windows下动态库为.DLL文件,Linux下为.so文件
  • Mac OS X下动态链接库扩展名是.dylib和tbd,在最新的版本中, dylib已经被tbd取代。.dylib是Mach-O格式,也就是Mac OS X下的二进制文件格式。Mac OS X提供了一系列工具,用于创建和访问动态链接库。tbd文件是“基于文本的库链接”, 文本中注明真正链接的库的位置。
  • Framework:资源、动态库(dylib)、静态库(.a)的集合。Private Framework 被归类为苹果内部框架,Apple不提供任何头文件或文档
  • 大多数三方库仍然以.dylib的形式存在,最终存放在/usr/lib中
  • 系统库:MacOS 和 iOS 底层核心库: /usr/lib/libSystem.B.dylib。它提供了数千个基础 C 函数,这些函数组成了真正的“Core OS”服务——也就是由C运行时的最低级别提供的服务,或者内核函数的包装器

在最近几个macOS版本中,Apple使用.tbd文件来减小无效系统库在系统中的空间,因此/usr/lib内不再有显式的libSystem.dylib文件。

基本工具

  • 汇编器:/usr/bin/as
  • nasm汇编器: Netwide Assembler: an assembler targeting the Intel x86 series of processors, with portable source.
  • 链接器:/usr/bin/ld
  • /usr/bin/libtool:创建动态链接库
  • otool -L: 和ldd类似,查看动态库依赖
  • man dyld: 查看动态库帮助
  • xcrun : Run or locate development tools and properties.

GCC与LLVM

类Unix系统上编译器主要有两大阵营:GCC和LLVM.。GCC包括C编译器 gcc 、调试器 gdb 等,LLVM项目包括C编译器 clang 、调试器 lldb

Hello World程序

; /usr/local/bin/nasm -f macho64 64.asm && ld -macosx_version_min 10.7.0 -lSystem -o 64 64.o && ./64

global _main


section .text

_main:
    mov     rax, 0x2000004 ; write
    mov     rdi, 1 ; stdout
    mov     rsi, msg
    mov     rdx, msg.len
    syscall

    mov     rax, 0x2000001 ; exit
    mov     rdi, 0
    syscall


section .data

msg:    db      "Hello world!", 10
.len:   equ     $ - msg

编译与链接

export SDKROOT=`/usr/bin/xcrun --show-sdk-path -sdk macosx`
as helloworld.s -o helloworld.o
或者:nasm -f macho64 helloworld.s
ld helloworld.o -lSystem -L $(SDKROOT)/usr/lib -o helloworld

参考文档

猜你喜欢

转载自blog.csdn.net/jgku/article/details/131723825