基于Android的ARM汇编语言系列之二:C/C++程序生成ARM汇编程序
时间:11-09
来源:互联网
点击:
二 编译
编译阶段编译器会检查代码规范性,以及是否有语法错误等。
执行以下命令进行编译,-S可以用来查看编译器输出。
gcc -S hello.i -o hello.s
生成的hello.s文件如下所示:
.arch armv5te.fpu softvfp.eabi_attribute 20, 1.eabi_attribute 21, 1.eabi_attribute 23, 3.eabi_attribute 24, 1.eabi_attribute 25, 1.eabi_attribute 26, 2.eabi_attribute 30, 6.eabi_attribute 18, 4.file "hello.c".section .rodata.align 2.LC0:.ascii "Hello ARM!\000".text.align 2.global main.type main, %functionmain:@ args = 0, pretend = 0, frame = 8@ frame_needed = 1, uses_anonymous_args = 0stmfd sp!, {fp, lr}add fp, sp, #4sub sp, sp, #8str r0, [fp, #-8]str r1, [fp, #-12]ldr r3, .L3.LPIC0:add r3, pc, r3mov r0, r3bl puts(PLT)mov r3, #0mov r0, r3sub sp, fp, #4ldmfd sp!, {fp, pc}.L4:.align 2.L3:.word .LC0-(.LPIC0+8).size main, .-main.ident "GCC: (GNU) 4.4.3".section .note.GNU-stack,"",%progbits
这里便是ARM汇编代码了,后续的文章会详细介绍这些代码的具体含义。
三 汇编
汇编阶段汇编器会将汇编代码汇编成二进制目标文件。
执行以下命令进行汇编:
gcc -c hello.s -o hello.o
生成的hello.o文件,用IDAPro反汇编以后如下所示:
;; +-------------------------------------------------------------------------+; | This file has been generated by The Interactive Disassembler (IDA) |; | Copyright (c) 2011 Hex-Rays,|; | License info: 48-327F-7274-B7 |; | ESET spol. s r.o. |; +-------------------------------------------------------------------------+;; Input MD5 : B0821B68099D81DC63D478051984E2D8; Input CRC32 : 68360FC1; File Name : C:\Users\Administrator\Desktop\\相关资料\Android软件安全与逆向分析\Android软件安全与逆向分析随书光盘\chapter6\6.2\6.2.2\hello\hello.o; Format : ELF for ARM (Relocatable);; EABI version: 5;; Source File : hello.c; Processor : ARM; Target assembler: Generic assembler for ARM; Byte sex : Little endian; Segment type: Pure codeAREA .text, CODECODE32; Attributes: bp-based frameEXPORT mainmainvar_C= -0xCvar_8= -8STMFD SP!, {R11,LR}ADD R11, SP, #4SUB SP, SP, #8STR R0, [R11,#var_8]STR R1, [R11,#var_C]LDR R3, =(aHelloArm-0x20) ; "Hello ARM!"ADD R3, PC, R3 ; "Hello ARM!"MOV R0, R3 ; sBL puts ; PIC modeMOV R3, #0MOV R0, R3SUB SP, R11, #4LDMFD SP!, {R11,PC}; End of function main
四 链接
链接阶段会调用链接器将二进制的目标文件链接成Android平台可执行的ARM原生程序。
执行以下命令进行链接:
gcc hello.o -o hello
这个过程还需要链接其他目标文件,参数配置见以下Makefile脚本:
NDK_ROOT=c:/android-ndk-r8TOOLCHAINS_ROOT=$(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windowsTOOLCHAINS_PREFIX=$(TOOLCHAINS_ROOT)/bin/arm-linux-androideabiTOOLCHAINS_INCLUDE=$(TOOLCHAINS_ROOT)/lib/gcc/arm-linux-androideabi/4.4.3/include-fixedPLATFORM_ROOT=$(NDK_ROOT)/platforms/android-14/arch-armPLATFORM_INCLUDE=$(PLATFORM_ROOT)/usr/includePLATFORM_LIB=$(PLATFORM_ROOT)/usr/libSYSROOT=$(PLATFORM_ROOT)MODULE_NAME=helloRM=delFLAGS=-I$(TOOLCHAINS_INCLUDE) \-I$(PLATFORM_INCLUDE) \-L$(PLATFORM_LIB) \OBJS=$(MODULE_NAME).o \$(PLATFORM_LIB)/crtbegin_dynamic.o \$(PLATFORM_LIB)/crtend_android.oall:$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -E $(MODULE_NAME).c -o $(MODULE_NAME).i$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -S $(MODULE_NAME).i -o $(MODULE_NAME).s$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -c $(MODULE_NAME).s -o $(MODULE_NAME).o$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -nostdlib -lgcc -Bdynamic -lc $(OBJS) -o $(MODULE_NAME)clean:$(RM) *.oinstall:adb push $(MODULE_NAME) /data/local/adb shell chmod 755 /data/local/$(MODULE_NAME)
生成
AndroidARM汇编语言汇编程 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)