如何编译预置obj 文件?

1. 如何在preloader 中预置obj 文件?
Branch: GB, GB2, ICS, ICS2, JB, JB2
Step1. 首先获取obj 文件,如果是preloader 已有的Source code 需要预置为obj 文
件,那么可到如下路径获取obj 文件:mediatek/[source]/preloader/out
Step2. 在mediatek/[source]/preloader 目录下创建文件夹:myobjs,将Step1 中获取
的obj 文件放到该文件夹中
Step3. 修改mediatek/[source]/preloader/Makefile 文件,在该文件如下Code:
$(D_BIN)/$(PL_IMAGE_NAME).elf:
之前添加:
MYOBJS := $(D_ROOT)/myobj
Step4. 修改mediatek/[source]/preloader/Makefile 中$(D_BIN)/$(PL_IMAGE_NAME).elf
生成命令,将MYOBJS 加入:如下:
$(D_BIN)/$(PL_IMAGE_NAME).elf:
$(LD) --gc-sections -Bstatic -T$(MTK_PATH_PLATFORM)/link_descriptor.ld \
$(wildcard $(D_OBJ)/*) $(wildcard $(MYOBJS)/*) $(SECURITY_LIB) -Map
system.map -o $(D_BIN)/$(PL_IMAGE_NAME).elf
Step5. 如果添加的obj 文件在preloader 中有对应的Source code,还需要修改
Source code 对应的make File 文件,将该Source code 从make File 文件中删除,以
bmt.c 为例,需要修改medaitek/platform/$platform/preloader/src/drivers/makefile,
将bmt.c 从该文件的MOD_SRC 中删除
说明:preloader 的Source code 位于如下路径:
– mediatek/platform/$platform/preloader/
– mediatek/custom/$platform/preloader/
– mediatek/custom/common/preloader/
– mediatek/custom/$porject/preloader/
2. 如何在uboot 中预置obj 文件?
Branch: GB, GB2, ICS, ICS2
Case1. 该obj 文件是从第三方处获取,在codebase 原本不存在.c 文件,不需要编
译进某个lib 文件
Step1. 首先获取obj 文件
Step2. 在bootable/bootloader/uboot 目录下添加myobjs 文件夹,将Step1 中获取的
obj 文件放到该文件夹中
Step3. 修改bootable/bootloader/uboot/Makefile,在该文件如下Code:
GEN_UBOOT = \
之前添加:
MYCUSTOMOBJS := $(wildcard myobjs/*)
MEDIATEK CONFIDENTIAL
FOR zhanghui@ vanzotec.com USE ONLY
[email protected],time=2013-10-08 19:27:59,ip=180.166.121.198,doctitle=如何在preloader、uboot、lk、kernel中预置obj文件.docx,company=Vanzo_WCX
Step4. 修改bootable/bootloader/uboot/Makefile,将MYOBJSDIR 中的obj 文件添加
到u-boot 的生成命令中,如下:
GEN_UBOOT = \
UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | \
sed -n -e 's/.*\($(SYM_PREFIX)__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(MYCUSTOMOBJS)
$(__OBJS) \
Case2. 该obj 文件在Codebase 中存在对应的.c 文件,现在需要将.c 文件删除,替
换为obj 文件
Step1. 编译生成obj 文件,uboot 编译生成的obj 文件与其.c 文件位于同级目录下
Step2.在原先obj 文件目录下创建一个文件夹prebuilt,并将obj 文件放入其中,同
时将.c 文件删除
Step3. 修改包含该.c 文件的Makefile 文件(一般与.c 文件位于同级目录下),将该obj
文件的名称从OBJS 变量中删除,同时在该Makefile 中添加一个变量,MYOBJS,将
该obj 文件添加到MYOBJS 中,以
bootable/bootloader/uboot/drivers/video/cfb_console.c 为例,修改该目录下的
Makefile 文件,将cfb_console.o 从变量OBJS 中删除,同时添加一行:
MYOBJS := cfb_console.o
Step4. 继续修改Step3 中的Makefile,将MYOBJS 添加到生成LIB 的命令中,如下:
$(LIB): $(OBJS) $(SOBJS)
$(AR) $(ARFLAGS) $@ $(OBJS) $(MYOBJS) $(SOBJS)
Case3. 某些模块,Uboot 和kernel 共用同一份Source code,比如LCM,这种情况
需要做特殊处理,以LCM 为例,如下:
Step1. 首先编译出obj 文件,路径位于:mediatek/custom/out/$project/uboot/lcm,
同时将要替换的Source code 删除(mediate/custom/common/kernel/lcm)
Step2. 在mediatek/custom/$project/uboot 下面添加lcm 文件夹,同时将Step1 中获
取到的obj 文件添加到该文件夹下,同时将原目录下的obj 文件删除(这里获取的
obj 文件一定要是Uboot 目录下的,不要到kernel 目录下获取这些obj 文件)
Step3. 修改mediatek/custom/common/uboot/Makefile 文件,将要替换的obj 文件
名称从COBJS 删除:COBJS += $(patsubst %.c, %.o, $(wildcard lcm/*.c))
Step4. 继续修改Step3 中的Makefile,添加如下Code:MYOBJS := $(addprefix $(obj),
$(wildcard lcm/*.o)),同时将MYOBJS 添加到$(LIB)的编译命令中,如下:
$(LIB): $(OBJS) $(SOBJS)
$(AR) $(ARFLAGS) $@ $(OBJS) $(MYOBJS) $(SOBJS)
说明:Uboot 的Source Code 主要位于如下路径:
– bootable/bootloader/uboot/
– mediatek/platform/$platform/uboot/
MEDIATEK CONFIDENTIAL
FOR zhanghui@ vanzotec.com USE ONLY
[email protected],time=2013-10-08 19:27:59,ip=180.166.121.198,doctitle=如何在preloader、uboot、lk、kernel中预置obj文件.docx,company=Vanzo_WCX
– mediatek/custom/$platform/uboot/
– mediatek/custom/common/uboot/
– mediatek/custom/$porject/uboot/
3. 如何在kernel 中预置obj 文件?
Branch:GB, GB2, ICS
– 比如要将xxx.c 用xxx.o 替代编译
– 先正常编译出xxx.o
– 然后在xxx.c 所在目录下创建prebuilt 目录,将xxx.o 放入
• 注意prebuilt 目录的目录名不能修改,否则在clean 阶段会被清除
– 修改xxx.c 所在目录下的Makefile 文件,原本已经有obj-y := xxx.o,在其后
面添加xxx-y := prebuilt/xxx.o 即可
– mediatek/custom/[XXX]/kernel 目录下对应的Source Code 没有Makefile 文件,
自己在Source code 对应的同级目录下添加一个Makefile 即可
Branch:ICS2, JB, JB2
– 比如要将debug.c 用debug.o 替代编译
– 先正常编译出debug.o (针对kernel 和lk, uboot 共用Source Code 的情况,
如LCM,这里获取 到的obj 文件一定要是kernel/out 目录下的)
– 然后将debug.o 复制到原先debug.c 所在目录下,并重命名为
debug.o_shipped
– 原先debug.c 同级目录下的Makefile 不变,依然保持为
obj-y:=debug.o;mediatek/custom/[XXX]/kernel 目录下对应的Source Code 没有
Makefile 文件,自己在Source code 对应的同级目录下添加一个Makefile 即可
– 重新编译kernel 即可
说明:kernel 的Source code 主要位于如下路径:
– kernel/
– mediatek/platform/$platform/kernel/
– mediatek/[source]/kernel/
– mediatek/custom/$platform/kernel/
– mediatek/custom/common/kernel/
– mediatek/custom/$porject/kernel/
4. 如何在lk 中预置obj 文件
Branch:JB,JB2
Step1. 在bootable/bootloader/lk/makefile 中添加:MYOBJ :=
Step2. 获取obj 文件,Codebase 编译生成的obj 文件位于
bootable/bootloader/lk/build-$project/custom/$project/lk 目录下
Step3. 将获取的obj 文件放到与.c 文件相同目录下;同时可将.c 文件删除
MEDIATEK CONFIDENTIAL
FOR zhanghui@ vanzotec.com USE ONLY
[email protected],time=2013-10-08 19:27:59,ip=180.166.121.198,doctitle=如何在preloader、uboot、lk、kernel中预置obj文件.docx,company=Vanzo_WCX
Step4. 将相应的.c 文件从包含该.c 文件的rules.mk(一般与.c 文件位于同级目录)中删

Step5. 将Step3 中添加的.o 文件在rules.mk 中添加到MYOBJ,比如MYOBJ += test.o
Step6. 打开bootable/bootloader/lk/make/build.mk,将MYOBJ 添加到OUTELF 的生
成命令中,如下:
else
$(OUTELF): $(ALLOBJS) $(LINKER_SCRIPT)
@echo linking $@
$(NOECHO)$(LD) $(LDFLAGS) -T $(LINKER_SCRIPT) $(ALLOBJS)
$(MYOBJ) $(LIBGCC) -o $@ endif
Step7. 如果要替换的.c 文件是lk 与kernel 共用的,比如lcm 模块,那么Step2 需要
做一下修改:将获取的obj 文件放到mediatek/custom/$project/lk/lcm 中,同时要
确保这里获取的obj 文件是bootable/bootloader/lk/build-
$project/custom/$project/lk 目录下的,不要到kernel/out 目录下获取这些obj 文件
说明:lk 的Source Code 主要位于如下路径:
– mediatek/platform/$platform/lk/
– mediatek/custom/$platform/lk/
– mediatek/custom/common/lk/
– mediatek/custom/$porject/lk/
– bootable/bootloader/lk/
MEDIATEK CONFIDENTIAL
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章