微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于Android的ARM汇编语言系列之二:C/C++程序生成ARM汇编程序

基于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)

生成

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top