libc是Linux下的ANSI C的函数库。html
ANSI C是基本的C语言函数库,包含了C语言最基本的库函数。这个库能够根据 头文件划分为 15 个部分,其中包括:字符类型 ()、错误码()、 浮点常数 ()、数学常数 ()、标准定义 ()、 标准 I/O ()、工具函数 ()、字符串操做 ()、 时间和日期 ()、可变参数表 ()、信号 ()、 非局部跳转 ()、本地信息 ()、程序断言 () 等等。这在其余的C语言的IDE中都是有的。linux
libc.a在ARM平台中通常在交叉编译对应的目录中web
/usr/local/arm/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib/libc.a
test.c文件shell
#include <string.h> int ar[100]; int (*print)(const char *format, ...) = (void*)0x43e11a2c; int sum = 0; extern unsigned int __bss_start; extern unsigned int __bss_end; int main(void) { int i = 0; //memset((void*)&__bss_start, 0, (int)&__bss_end - (int)&__bss_start); for (i = 0; i < 10; i++) { print("ar[%d] = %d\n", i, ar[i]); } print("sum = %d\n", sum); return 0; }
start.lds文件app
ENTRY(_start); OUTPUT("test"); OUTPUT_ARCH(arm); SECTIONS { . = 0x40000000; .text : { start.o(.text); *(.text); } .rodata : { *(.rodata); } . = ALIGN(4); .data : { *(.data); } . = ALIGN(4); __bss_start = .; .bss : { *(.bss); } __bss_end = .; }
Makefile文件svg
CROSS_COMPILE = arm-linux- CC = $(CROSS_COMPILE)gcc CC_FLAGS = -c -I ./ LD = $(CROSS_COMPILE)ld LD_FLAGS = -T start.lds -Ttext 0x40008000 OBJCOPY = $(CROSS_COMPILE)objcopy COPY_FLAGS = -O binary OBJDUMP=$(CROSS_COMPILE)objdump DUMP_FLAGS=-D TARGET=test LIBS=lib/libc.a OBJS=start.o led.o lib.o test.o bell.o key.o all: $(OBJS) $(LD) $(LD_FLAGS) $(OBJS) $(LIBS) -o $(TARGET) $(OBJCOPY) $(COPY_FLAGS) $(TARGET) $(TARGET).bin $(OBJDUMP) $(DUMP_FLAGS) $(TARGET) > $(TARGET).dis rm -rf *.o %.o:%.s $(CC) $(CC_FLAGS) $< %.o:%.S $(CC) $(CC_FLAGS) $< %.o:%.c $(CC) $(CC_FLAGS) $< .PHONY:clean clean: rm -rf *.o $(TARGET).bin $(TARGET).dis $(TARGET)
测试结果函数
## Starting application at 0x40008000 ... ar[0] = 0 ar[1] = -509595648 ar[2] = -481165304 ar[3] = 973078545 ar[4] = -485294077 ar[5] = 348327937 ar[6] = 306323457 ar[7] = 452984827 ar[8] = -503246593 ar[9] = -511634431 sum = -202655882 ## Application terminated, rc = 0x0
test.c文件内容工具
#include <string.h> int ar[100]; int (*print)(const char *format, ...) = (void*)0x43e11a2c; int sum = 0; extern unsigned int __bss_start; extern unsigned int __bss_end; int main(void) { int i = 0; memset((void*)&__bss_start, 0, (int)&__bss_end - (int)&__bss_start); for (i = 0; i < 10; i++) { print("ar[%d] = %d\n", i, ar[i]); } print("sum = %d\n", sum); return 0; }
执行结果测试
## Starting application at 0x40008000 ... ar[0] = 0 ar[1] = 0 ar[2] = 0 ar[3] = 0 ar[4] = 0 ar[5] = 0 ar[6] = 0 ar[7] = 0 ar[8] = 0 ar[9] = 0 sum = 0 ## Application terminated, rc = 0x0 DengJin #
6.1 Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdfspa