d:/linux/linuxkernel/WORKING_DIRECTORY/android-omap-20111108-gingerbread/libcore/luni/src/main/native/java_lang_ProcessManager.cpp:259: undefined reference to `environ'
`environ' is defined in d:\linux\linuxkernel\WORKING_DIRECTORY\android-omap-20111108-gingerbread\bionic\libc\bionic\libc_init_common.c:
char **environ;
but due to some reason, it's not working. I conduct a test for this. if I change environ to environ1, it's working, but not for environ. It's also different in the object file(.o) when I change the name of environ. So change the definition in java_lang_ProcessManager.cpp:
//extern char **environ;
char **environ;
http://msdn.microsoft.com/en-us/library/stxk41x1(v=VS.71).aspx
http://msdn.microsoft.com/zh-cn/vstudio/stxk41x1
app使用期间,前台Activity经常被其他的可视组件遮挡,进入paused状态,例如一个对话框弹出时,只要Activity部分可见,但没获得焦点,就处在paused状态
然而,一旦Activity完全不可见,就处在stopped状态
当Activity进入paused状态时,系统调用onPause()方法,其中你可以停止一些任务,或者保存一些数据防止用户其后又退出,如果用户又返回,可以调用onResume()方法脱离paused状态
Note: 当Activity接到一个onPause()调用时,可能预示着用户是暂时离开,还会回来,也通常是用户离开时的第一个提示
Pause你的Activity当Activity接到一个onPause()调用,技术上意味着Activity部分可见,但通常表示用户离开这个Activity,即将进入stopped状态,在onPause()中,通常要做一下事情:
- 停止动画或者其他正在进行的耗费CPU的动作
- 提交未保存的变化,但是只有在用户认为数据应该被保存的时候,例如邮件的草稿
- 释放系统资源,例如broadcast receivers, 传感器句柄(例如GPS),或者其他影响电池电量而用户有不用的资源
例如,使用照相机,在onPause()中就可以关掉
@Override public void onPause() { super.onPause(); // Always call the superclass method first // Release the Camera because we don't need it when paused // and other activities might need to use it. if (mCamera != null) { mCamera.release() mCamera = null; } }
通常,不应该在onPause()中关闭CPU敏感的资源,像database connection,会延缓Activity之间的转换,他们最好在onStop()中实现
如果Activity将要进入Stopped状态,在onPause()中就要相对简单的完成操作以使用户能尽快转到下一个Activity,免得影响用户体验
Note: Activity处于paused状态时,Activity的实例还在内存中存在,回到Resumed状态时不需要重新初始化
Resume你的Activity从paused状态到resumed状态调用onResume()
只要Activity到前台就要调用onResume()方法,包括第一次创建Activity,所以在onRe()方法中要初始化onPause()中释放的组件和其他每次进入resumed状态要实现的动作,例如动画或者只有在获得用户焦点才需要初始化的组件
例如,下面的例子初始化在onPause()中释放的Carema
@Override public void onResume() { super.onResume(); // Always call the superclass method first // Get the Camera instance as the activity achieves full user focus if (mCamera == null) { initializeCamera(); // Local method to handle camera init } }
uboot更目录下的Makefile分析
一.配置过程(make smdk2410_config):
smdk2410_config : unconfig //相当于执行这条语句
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
------------------------------------------------------------------解析-------------------------------------------------------------------------
MKCONFIG := $(SRCTREE)/mkconfig 最终替换mkconfig
$(@:_config=) @表示目标,最终替换smdk2410
从而说明,执行make smdk2410_config命令,相当于执行以下命令:
mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
======================================================================================
$0 $1 $2 $3 $4 $5 $6
命令 cpu的架构 cpu类型,对应于cpu\arm920t 开发板型号,board\smdk2410 厂家 soc
注:
在linux的脚本文件里面,可以用$n来表示第n个参数,$0才是第一个参数,即为命令!!!!
======================================================================================
对上一句命令进一步解析:
打开uboot更目录下面的mkconfig脚本文件,观看分析:
[ "${BOARD_NAME}" ] || BOARD_NAME="$1" //如果有BOARD_NAME,就用这个的BOARD_NAME,
//如果为空,则让BOARD_NAME = $1(即smdk2410)
cd ./include
rm -f asm
ln -s asm-$2 asm //相当于ln -s asm-arm asm(建立一个连接文件asm,指向asm-arm)
问:为什么要建立这样的连接文件呢?
答:是为了在源码中写代码的方便,比如:
#include <asm/type.h> //源码中的书写形式!!!!
但是当执行完配置命令后,就相当于#include <asm-arm/type.h>。这样方便支持多种建构
rm -f asm-$2/arch //rm -f asm-arm/arch
ln -s ${LNPREFIX}arch-$6 asm-$2/arch //ln -s arch-s3c24x0 asm-arm/arch
//在asm-arm目录下建立一个连接文件arch,指向arch-s3c24x0
rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc //ln -s proc-armv asm-arm/proc
//在asm-arm目录下建立一个连接文件proc,指向proc-armv
*************************************************************************************************
# Create include file for Make
# 创建一个配置文件config.mk
echo "ARCH = $2" > config.mk //>表示新建文件
echo "CPU = $3" >> config.mk //>>表示在原有的文件中追加类容
echo "BOARD = $4" >> config.mk
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
**************************执行以上5句命令后,相当于config.mk中有类容****************************
ARCH = arm
CPU = arm920t
BOARD = $4smdk2410
SOC = s3c24x0
注意:
config.mk用于更目录的Makefile完成相关的配置筛选!!!
*************************************************************************************************
# Create board specific header file
#创建一个单板相关的头文件
> config.h # Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h
*************************执行以上4句命令后,相当于config.h中有类容******************************
Automatically generated - do not edit
#include <configs/$1.h>
注意:
config.h用于完成代码中相关配置的筛选!!!
*************************************************************************************************
二.编译过程(make)
再看Makefile.............................
# load ARCH, BOARD, and CPU configuration
include $(OBJTREE)/include/config.mk //包含上面配置过程生成的config.mk文件
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux- //如果ARCH = arm,则编译工具为arm-linux-
OBJS = cpu/$(CPU)/start.o //非常重要的命令!!!!!
//$(CPU) 即调用CPU = arm920t 即:OBJS = cpu/arm920t/start.o
LIBS = lib_generic/libgeneric.a
LIBS += board/$(BOARDDIR)/lib$(BOARD).a //LIBS += board/smdk2410/libsmdk2410.a
LIBS += cpu/$(CPU)/lib$(CPU).a //LIBS += cpu/arm920t/libarm920t.a
...
-------------------------------------------------------------------------
或者展开下列的定义:
ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)
$(obj)u-boot.bin: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
$(obj)u-boot: depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
-Map u-boot.map -o u-boot
-------------------------------------------------------------------------
或者直接make,然后观察编译信息:
cd /uboot_kernel/u-boot-1.1.6 &&
arm-linux-ld -Bstatic -T /uboot_kernel/u-boot-1.1.6/board/smdk2410/u-boot.lds
-Ttext 0x33F80000 $UNDEF_SYM cpu/arm920t/start.o
\--start-group lib_generic/libgeneric.a board/smdk2410/libsmdk2410.a cpu/arm920t/libarm920t.a cpu/
arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/
jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/
librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/
sk98lin/libsk98lin.a post/libpost.a post/cpu/libcpu.a common/libcommon.a --end-group -L /usr/local/arm/3.4.1/
bin/../lib/gcc/arm-linux/3.4.1 -lgcc \
-Map u-boot.map -o u-boot
-------------------------------------------------------------------------
注:从上面的连接过程得知。目标是依赖于连接脚本,start.o和许多lib库文件!!
问:那么多的连接时,依赖的原材料,让门谁放在最前面呢?
答:看连接脚本(board/smdk2410/u-boot.lds)便可以知道答案!!!
打开u-boot.lds,分析:
SECTIONS
{
. = 0x00000000; //当前地址等于0
//但是该地址会加上-Ttext 0x33F80000指出的0x33F80000,用于说明以后的东西会从0x33F80000这个地方开始排放!!!
//另外注意:-Ttext 0x33F80000中的0x33F8000是由board/smdk2410/config.mk中定义的!!这个的值可以根据自己开发板的内存的大小来做相应的调整!!
. = ALIGN(4); //下面采用4字节对齐方式
.text :
{
cpu/arm920t/start.o (.text) //最先放该文件的所有的代码段!!
*(.text) //再放其他的所有文件的代码段
}
. = ALIGN(4);
.rodata : { *(.rodata) } //所有文件的只读数据段(由const定义)
. = ALIGN(4);
.data : { *(.data) } //所有文件的数据段
. = ALIGN(4);
.got : { *(.got) } //
. = .; //当前地址
__u_boot_cmd_start = .; //__u_boot_cmd_start等于当前地址
.u_boot_cmd : { *(.u_boot_cmd) } //所有文件的.u_boot_cmd(由uboot自己定义的)段
__u_boot_cmd_end = .;
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}
------------------------------------------------
综上得出结论:uboot被start.o来贯穿的!!!!
数据的排放是根据连接脚本u-boot.lds来排放的!!!!
共享以前分析uboot时做的笔记,包括:
1.u-boot-1.1.6的配置编译过程分析.doc
2.u-boot-2012.04.01的配置编译过程分析.doc
3.u-boot-1.1.6完全注释,基本实现了逐行的注释。
...... // 后继更新的将直接上传群共享
请大家原谅哈,由于我们想建立一个uboot技术交流社区,
需要经费。故上述uboot笔记,需要9元钱购买,购买链接地址:
http://item.taobao.com/item.htm?spm=0.0.0.31.lHTZaH&id=17051965131
当然,为了让大家觉得花钱值得。大家购买后,可以凭借
购买的帐号,加入“uboot移植交流群”。
该群由我(韦东山LINUX视频的答疑助手@万勇)和吴伟东(韦东
山LINUX视频的答疑助手-小吴)负责,我们会在:
每周3晚上7点到10点和每周日(下午3点到6点和晚上8点到10
点)负责答疑。和大家一起学习uboot,实现逐行分析注释uboot。
我们建立该uboot技术交流群的宗旨是:
找些人在一起,为全天下的板子移植uboot!!!!
入群条件:
1.你是高手,可以无条件的入群。当然有考核的;
2.或者你是想学习的,购买“uboot完全注释”后,提供网名,入群