C IN ARM64 彙編基礎-例項helloworld-基於The C Programming Language - Second Edition
阿新 • • 發佈:2019-01-09
可以在原始碼某個目錄下新建一個資料夾,比如frameworks/testing目錄下:
寫一個Android.mk檔案:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= var_extern.c
LOCAL_MODULE:= var_extern
LOCAL_64_BIT_ONLY := true //只編譯64位的庫
LOCAL_CFLAGS += -O0 //關閉優化
include $(BUILD_SHARED_LIBRARY)
1、定位Native bug的時候需要對分析彙編,所以記錄一下相關基礎
2、程式碼是在Android O版本上編譯的,64位,編譯出so庫,使用objdump工具反彙編即可
3、相關原始碼即彙編程式碼
1)原始碼:
#include <stdio.h>
#include <stdio.h>
int main()
{
printf("Hello,world!\n");
return 0;
}
2)彙編程式碼
00000000000005a8 <main>:
5a8: a9bf7bfd stp x29, x30, [sp,#-16]! //從棧申請16個byte空間,儲存x29、x30
5ac: 910003fd mov x29, sp //sp放到x29,fp此時的位置就是sp
5b0: 90000000 adrp x0, 0 <abitag-0x200>
5b4: 91172000 add x0, x0, #0x5c8 //x0=x0+0x5c8,x0會作為printf函式的第一個引數
5b8: 97ffffcc bl 4e8 < [email protected]> //跳轉到4e8,輸出字串
5bc: 2a1f03e0 mov w0, wzr //w0暫存器儲存返回值0
5c0: a8c17bfd ldp x29, x30, [sp],#16 //取回fp、lr的值,彈棧
5c4: d65f03c0 ret //返回
上面是main函式對應的彙編程式碼,後面有對應的註釋
下面看一下0x5c8處的彙編:
00000000000005c8 <.rodata>: 5c8: 6c6c6548 .word 0x6c6c6548 //可以用gdb看看十六進位制字元對應的字串,就是Hello,world!\n 5cc: 6f772c6f .word 0x6f772c6f 5d0: 21646c72 .word 0x21646c72 字串常量都是放在elf檔案的.rodata 節