2

学习Arm-v8汇编-环境准备

 1 year ago
source link: https://findnorthstar.github.io/2021/05/16/learn-arm-assembly-language/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

学习Arm-v8汇编-环境准备

发表于 2021-05-16

| 分类于 工程

  • 安装编译调试组件
    • 由于手头只有带有WSL的x86环境,需要采用模拟执行的方式编译运行和调试arm程序
    • 参考这篇gist文章,可实现在x86环境上通过执行armv8程序,有以下几个步骤
      • 在WSL上安装
        • 交叉编译环境:sudo apt-get install libc6-dev-arm64-cross gcc-aarch64-linux-gnu
        • QEMU模拟环境:sudo apt-get install qemu qemu-system qemu-user
  • 编译运行命令
    • 准备源代码hello.c,内容一般是打印hello ARM之类的
    • 静态链接编译:aarch64-linux-gnu-gcc -static -ohello hello.c
      • 优点:运行不需要依赖动态库,指令执行地址确定
      • 缺点:编译出的二进制体积较大,依赖库升级比较麻烦
    • 静态编译运行:qemu-aarch64 hello
    • 动态链接编译:aarch64-linux-gnu-gcc -ohello hello.c
      • 运行需要指定动态链接库目录
    • 动态编译运行:qemu-aarch64 -L /usr/aarch64-linux-gnu/ hello
  • 调试命令
    • 根据这篇文章以及stackoverflow的讨论,可以通过安装gdb-multiarch来调试程序
    • 编译选项加入取消地址随机化的和编译带调试符号的选项
      • aarch64-linux-gnu-gcc -fno-pie -ggdb3 -no-pie -o hello hello.c
    • 运行选项同样指定动态链接库目录
      • qemu-aarch64 -L /usr/aarch64-linux-gnu/ -g 10101 ./hello
    • 新开窗口通过gdb-multiarch连上10101端口进行调试
      gdb-multiarch -q --nh \
      -ex 'set architecture aarch64' \
      -ex 'set sysroot /usr/aarch64-linux-gnu/' \
      -ex 'file hello' \
      -ex 'target remote localhost:10101' \
      -ex 'break main' \
      -ex continue \
      -ex 'layout split'
      ;

调试的示例如下,可以通过分割layout查看调试的源代码和汇编指令等,比较方便。可以看到printf实际上是调用到libc提供的puts是实现的,有gdb之后单步调试就比较方便了。

通过以上的配置,基本就可以愉快的开始调试和学习Arm-v8汇编了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK