當前位置:首頁 » 編程軟體 » android編譯lk

android編譯lk

發布時間: 2022-05-27 20:35:16

Ⅰ android bootloader lk階段能讀取文件嗎

1.主要功能,紅色部分是android特有的一些功能,如fastboot,recovery模式等:
* Variety of nand devices for bootup
* USB driver to enable upgrading images over usb ring development
* Keypad driver to enable developers enter 『fastboot』 mode for image upgrades
* Display driver for debugging and splash screen
* Enable Android recovery image and image upgrades

2.配置dram內存大小,供linux kernel使用
The memory tags can be customized inlk/target/<target_name>/atags.c

3.fastboot模式,可以自行打開或者關閉
如,在boot中關閉按鍵或者usb 驅動,都可以達到此目的
相關文件
k/app/aboot/fastboot.c
lk/app/aboot/aboot.c

4.MTD block setting
可以配置各個mtd image 分區在如下 文件中
lk\target\tcc8900_evm\init.c
static struct ptentry board_part_list[]

5.打開或者關閉splash screen in the bootloader
DISPLAY_SPLASH_SCREEN功能可以來打開關閉
開機時候,boot會從』splash』 MTD分區中讀取原始的文件到framebuffer中顯示,所以也需要載入display 的驅動
入口函數在 kernel/main.c 中的 kmain(), 以下就來讀讀這一段 code.

void kmain(void)
{
// get us into some sort of thread context
thread_init_early();
// early arch stuff
arch_early_init();
// do any super early platform initialization
platform_early_init();
// do any super early target initialization
target_early_init();
dprintf(INFO, "welcome to lk/n/n");

// deal with any static constructors
dprintf(SPEW, "calling constructors/n");
call_constructors();
// bring up the kernel heap
dprintf(SPEW, "initializing heap/n");
heap_init();
// initialize the threading system
dprintf(SPEW, "initializing threads/n");
thread_init();
// initialize the dpc system
dprintf(SPEW, "initializing dpc/n");
dpc_init();
// initialize kernel timers
dprintf(SPEW, "initializing timers/n");
timer_init();
#if (!ENABLE_NANDWRITE)
// create a thread to complete system initialization
dprintf(SPEW, "creating bootstrap completion thread/n");
thread_resume(thread_create("bootstrap2", &bootstrap2, NULL, DEFAULT_PRIORITY, DEFAULT_STACK_SIZE));
// enable interrupts
exit_critical_section();
// become the idle thread
thread_become_idle();
#else
bootstrap_nandwrite();
#endif
}

In include/debug.h: 我們可以看到 dprintf 的第一個參數是代表 debug level.

/* debug levels */
#define CRITICAL 0
#define ALWAYS 0
#define INFO 1
#define SPEW 2
In include/debug.h:

view plainprint?
#define dprintf(level, x...) do { if ((level) <= DEBUGLEVEL) { _dprintf(x); } } while (0)

所以 dprintf 會依 DEBUGLEVEL 來判斷是否輸出信息.

來看第一個 call 的函數: thread_init_early, define in thread.c

view plainprint?
void thread_init_early(void)
{
int i;
/* initialize the run queues */
for (i=0; i < NUM_PRIORITIES; i++)
list_initialize(&run_queue[i]);
/* initialize the thread list */
list_initialize(&thread_list);
/* create a thread to cover the current running state */
thread_t *t = &bootstrap_thread;
init_thread_struct(t, "bootstrap");
/* half construct this thread, since we're already running */
t->priority = HIGHEST_PRIORITY;
t->state = THREAD_RUNNING;
t->saved_critical_section_count = 1;
list_add_head(&thread_list, &t->thread_list_node);
current_thread = t;
}

#define NUM_PRIORITIES 32 in include/kernel/thread.h

list_initialize() defined in include/list.h: initialized a list

view plainprint?
static inline void list_initialize(struct list_node *list)
{
list->prev = list->next = list;
}

run_queue 是 static struct list_node run_queue[NUM_PRIORITIES]

thread_list 是 static struct list_node thread_list

再來要 call 的函數是: arch_early_init() defined in arch/arm/arch.c

view plainprint?
void arch_early_init(void)
{
/* turn off the cache */
arch_disable_cache(UCACHE);
/* set the vector base to our exception vectors so we dont need to double map at 0 */
#if ARM_CPU_CORTEX_A8
set_vector_base(MEMBASE);
#endif
#if ARM_WITH_MMU
arm_mmu_init();
platform_init_mmu_mappings();
#endif
/* turn the cache back on */
arch_enable_cache(UCACHE);
#if ARM_WITH_NEON
/* enable cp10 and cp11 */
uint32_t val;
__asm__ volatile("mrc p15, 0, %0, c1, c0, 2" : "=r" (val));
val |= (3<<22)|(3<<20);
__asm__ volatile("mcr p15, 0, %0, c1, c0, 2" :: "r" (val));
/* set enable bit in fpexc */
val = (1<<30);
__asm__ volatile("mcr p10, 7, %0, c8, c0, 0" :: "r" (val));
#endif
}

現代操作系統普遍採用虛擬內存管理(Virtual Memory Management)機制,這需要處理器中的MMU(Memory Management Unit,
內存管理單元)提供支持。
CPU執行單元發出的內存地址將被MMU截獲,從CPU到MMU的地址稱為虛擬地址(Virtual Address,以下簡稱VA),而MMU將這個地
址翻譯成另一個地址發到CPU晶元的外部地址引腳上,也就是將VA映射成PA
MMU將VA映射到PA是以頁(Page)為單位的,32位處理器的頁尺寸通常是4KB。例如,MMU可以通過一個映射項將VA的一頁
0xb7001000~0xb7001fff映射到PA的一頁0x2000~0x2fff,如果CPU執行單元要訪問虛擬地址0xb7001008,則實際訪問到的物理地
址是0x2008。物理內存中的頁稱為物理頁面或者頁幀(Page Frame)。虛擬內存的哪個頁面映射到物理內存的哪個頁幀是通過頁
表(Page Table)來描述的,頁表保存在物理內存中,MMU會查找頁表來確定一個VA應該映射到什麼PA。

操作系統和MMU是這樣配合的:

1. 操作系統在初始化或分配、釋放內存時會執行一些指令在物理內存中填寫頁表,然後用指令設置MMU,告訴MMU頁表在物理內存中
的什麼位置。
2. 設置好之後,CPU每次執行訪問內存的指令都會自動引發MMU做查表和地址轉換操作,地址轉換操作由硬體自動完成,不需要用指令
控制MMU去做。

MMU除了做地址轉換之外,還提供內存保護機制。各種體系結構都有用戶模式(User Mode)和特權模式(Privileged Mode)之分,
操作系統可以在頁表中設置每個內存頁面的訪問許可權,有些頁面不允許訪問,有些頁面只有在CPU處於特權模式時才允許訪問,有些頁面
在用戶模式和特權模式都可以訪問,訪問許可權又分為可讀、可寫和可執行三種。這樣設定好之後,當CPU要訪問一個VA時,MMU會檢查
CPU當前處於用戶模式還是特權模式,訪問內存的目的是讀數據、寫數據還是取指令,如果和操作系統設定的頁面許可權相符,就允許訪
問,把它轉換成PA,否則不允許訪問,產生一個異常(Exception)

常見的 segmentation fault 產生的原因:
用戶程序要訪問一段 VA, 經 MMU 檢查後無權訪問, MMU 會產生異常, CPU 從用戶模式切換到特權模式, 跳轉到內核代碼中執行異常服務程序.
內核就會把這個異常解釋為 segmentation fault, 將引發異常的程序終止.

Ⅱ C語言高手請進,結構體里的元素前面有一點「.」代表什麼意思比如 .goodvar

前面不加點也可以賦值,加 「.」的話可以不考慮賦值順序,比如可以先給resolution賦值,在給output賦值,可以寫成這樣:
struct atag_tcc_entry tcc_param = {
.resolution = 0,
.output = 0,
}
原理就是因為加 「.」就表示在這個結構體中選擇這個變數來賦值,所以可以不考慮結構體中變數的順序
不加"."的話賦值可以直接寫
struct atag_tcc_entry tcc_param = {
0, 0,
}
這樣就必須要按照順序來賦值了

Ⅲ 請問android uboot 和 little kernel是什麼關系

android uboot平台更多 高通用的little krenel 可以看做是uboot 里的一部分 類似一個小操作系統來引導 反正我是這么理解的

Ⅳ android studio 引用aar怎麼編譯不了

1、 簡述
在比較大的 Android 項目的開發中,我們經常會遇到工程、jar 包等等之間相互引用的方式。一般我們通過在 gradle 文件中配置依賴來解決,比如:
<img alt="通用配置" src="http://www.2cto.com/uploadfile/Collfiles/20150519/20150519085924119.png" title="" http:="" www.2cto.com="" kf="" ware="" vc="" "="" target="_blank" class="keylink" style="padding: 0px; margin: 0px auto; list-style: none; display: block; width: 630px; height: 198.454680534918px;">++o7q9q8SzuPbEv8K8z8LL+dPQt/u6z8Cp1bnD+7XEzsS8/tf3zqrSwMC1o7sgPGNvZGU+M8L2NvZGU+TWF2ZW5gIL/i1/fOqtLAwLWju9TaIE1hdmVuIL/i1tDQxCC/ydLUy9HL99fUvLrP69PDtcS/4r340NDSwMC1o7sgPGNvZGU++/Nf3zqrSwMC1oaMNCjxwPr+CIMG9uPa5pLPMo6zP682syrHS/+NXiuPYgTW9kdWxlIL//vNKqtbzI6yBDo6y2+++YWFyPC9jb2RlPiC/4rXEtPKw/Le9yr2jrM7Sw8e/++/="2aar-文件簡介">2、aar 文件簡介
要輸出 aar 文件,必須將 Mole 配置為 library,在 gradle 文件中如下:
輸出 aar : apply plugin: 'com.android.library'; 輸出 apk :apply plugin: 'com.android.application'。
將 Mole 配置為 library 後,構建輸出一個 aar 文件,根據渠道和 BuildType 的不同,在相應的目錄下可以找到。比如對 BuildType 為 debug 的配置,輸出為:[MoleName]/build/outputs/aar/[MoleName]-debug.aar。一份 aar 文件其實就是一份 zip 包,和 jar 不同的是,它將一些資源文件、第三方庫文件、so 文件等等都打包在內,而代碼文件編譯後壓縮在在 classes.jar 中。比如:

3、導入 aar 的方式引用
這種方式比較簡單,打開 Project Structure,添加一個新 Mole,然後選擇 Import *.JAR or *.AAR Package 的方式導入:

導入後,在你的工程下面,會生成一個文件夾,裡面是 aar 文件以及 Android Studio 的配置文件。

接著可以在 gradle 中配置依賴了,其他 Mole 可以引用這個 Mole 了,依賴方式使用compile project 的方式即可。
缺點:被依賴的 aar 無法 F3 跟進去,無法看到資源文件內容以及目錄層級等等缺陷。
4、使用配置依賴的方式引用
gradle 其實還有另一種依賴可以引用 aar:
compile(name: 'xxx', ext: 'aar')。
首先需要將 aar 文件放入引用 Mole 的 libs 目錄下,和一般的 jar 文件類似。然後在 gradle 配置文件中把 libs 目錄加入依賴:
?

1
2
3
4
5

<code class="hljs bash">repositories {
flatDir {
dirs 'libs'
}
}</code>


接著在 gradle 的依賴配置中加入 compile(name: 'xxx', ext: 'aar') 這一句,依賴即可關聯完畢。構建一下工程,在 Mole 的 build/intermediates/exploded-aar 目錄下,可以看到有一些臨時文件生成:

看起來完全是引用 aar 的解壓版本。Android Studio 安裝反編譯插件後,可以通過 F3 跟進到 class 文件裡面,如果你有被依賴 Mole 的源代碼的話,還可以 Attach Source 關聯源代碼查看。另外,可以很方便的查看 aar 中的資源文件。
另外,這種依賴方式更新 aar 後,生成的臨時文件也會隨之變動,不用擔心改動不同步的問題。
5、總結
綜上,介紹了 aar 文件的生成方式,以及兩種 aar 依賴的方式,經過實戰檢驗,第二種通過配置 gradle 依賴的方式簡單易用,只需一行代碼即可搞定。

Ⅳ lk是什麼意思

lk是like的縮寫。

like

英 [laɪk] 美 [laɪk]

prep. 像

conj. 如同

adv. 大概;和......一樣

adj. 相似的;同樣的

v. 喜歡;想;願意

n. 類似的人或物

At a distance he looks a bit like James Bond.

從遠處看,他有點像詹姆斯·邦德。

近義詞

fancy核心詞彙

英 ['fænsi] 美 ['fænsi]

adj. 華麗裝飾的;復雜的;引人注目的;時髦的;昂貴的;好的

n. 喜愛;幻想;想像力

vt. 想像;希望;迷戀

I have taken a fancy to that new bicycle.

我非常喜歡那輛新自行車。

Ⅵ 大家在android下集成的無線網卡,都是些什麼

android平台下默認支持TI公司的WIFI模塊,LINUX下有BOARDCOM的幾個WIFI晶元(BCM43XX系列)的驅動.
1、在你的BoardConfig.mk文件中增加一行(根據你的無線網卡類型來設置):

1: BOARD_WPA_SUPPLICANT_DRIVER := WEXT
2、在你的board配置目錄下創建一個wpa_supplicant.conf文件,輸入如下內容:

1: ctrl_interface=DIR=/data/system/wpa_supplicant
2: update_config=1
3、網路驅動模塊ko文件到你的board配置目錄下,下文假設網卡驅動模塊為LK_DRV_USB_RTL8192.ko。

4、修改board配置目錄下的AndroidBoard.mk,增加如下代碼:

1: file := $(TARGET_OUT)/lib/moles/LK_DRV_USB_RTL8192.ko
2: ALL_PREBUILT += $(file)
3: $(file) : $(LOCAL_PATH)/LK_DRV_USB_RTL8192.ko | $(ACP)
4: $(transform-prebuilt-to-target)
5:
6: file := $(TARGET_OUT_ETC)/wifi/wpa_supplicant.conf
7: ALL_PREBUILT += $(file)
8: $(file) : $(LOCAL_PATH)/wpa_supplicant.conf | $(ACP)
9: $(transform-prebuilt-to-target)
5、修改hardware/libhardware_legacy/wifi/wifi.c文件。

重新定義WIFI_DRIVER_MODULE_PATH和WIFI_DRIVER_MODULE_NAME宏,定義如下:

1: #ifndef WIFI_DRIVER_MODULE_PATH
2: #define WIFI_DRIVER_MODULE_PATH "/system/lib/moles/LK_DRV_USB_RTL8192.ko"
3: #endif
4: #ifndef WIFI_DRIVER_MODULE_NAME
5: #define WIFI_DRIVER_MODULE_NAME "LK_DRV_USB_RTL8192"
6: #endif
6、修改init.rc文件,修改如下:

1: chmod 0771 /system/etc/wifi wifi wifi
2: chmod 0660 /system/etc/wifi/wpa_supplicant.conf
3: chown wifi wifi /system/etc/wifi/wpa_supplicant.conf
4: mkdir /data/misc/wifi 0771 wifi wifi
5:
6: mkdir /data/misc/wifi/sockets 0771 wifi wifi
7: # wpa_supplicant socket
8: mkdir /data/system/ 0771 system system
9: mkdir /data/system/wpa_supplicant 0771 wifi wifi
10:
11: mkdir /data/misc/dhcp 0771 system system
12:
13: setprop wifi.interface wlan0
14:
15: ice wpa_supplicant /system/bin/wpa_supplicant -dd -Dwext -iwlan0 -c /system/etc/wifi/wpa_supplicant.conf
16: group system wifi inet
17: disabled
18: oneshot
19:
20: ice dhcpcd /system/bin/dhcpcd wlan0
21: group system dhcp
22: disabled
23: oneshot
注意如果有問題,請給各個目錄設置為777屬性,把文件設置為666的文件屬性試試。

7、最好是clean掉,全部重新編譯。享受終於可以享受wifi了!

Ⅶ QVector<QVector<cv::Point>> lk; qt平台中報錯 怎麼解決

聲明lk時要在兩個「>」之間加一個空格,否則與「>>」運算符相同了,編譯器就認為是「>>」運算符了;也就是把聲明語句改為:

QVector<QVector<cv::Point>>lk;

Ⅷ 如何寫android或linux內核可載入模塊

hello.c
/* hello.c */
#include <linux/init.h>
#include <linux/mole.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("tang");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world/n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, hello/n");
}
mole_init(hello_init);
mole_exit(hello_exit);
----------------------------------------------------------------------------
Makefile
/* Makefile*/
PWD := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/moles/$(KVER)/build
obj-m:=hello.o
all :
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD)
.PHONY : clean
clean :
rm -rf .*.cmd *.mod.c *.o *.ko .tmp_versions

linux下可以make編譯,希望對你有幫助!

Ⅸ android 需要codegen.dws么

1. 在Android L版本上 DCT tool配置的codegen.dws文件在preloader、lk、kernel中是獨立的,被分開放置,其路徑如下:

preloader:
alps\bootable\bootloader\preloader\custom\$(proj)\dct\dct\codegen.dws
lk:
alps\bootable\bootloader\lk\target\$(proj)\dct\dct\codegen.dws
kernel:
alps\kernel-3.10\arch\arm\mach-$(platform)\$(proj)\dct\dct\codegen.dws
or
alps\kernel-3.10\drivers\misc\mediatek\mach\$(platform)\$(proj)\dct\dct\codegen.dw

Ⅹ 如何編譯預置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

熱點內容
新一代唐dm哪個配置最劃算 發布:2024-05-02 22:45:16 瀏覽:228
安卓怎麼安裝到sd卡 發布:2024-05-02 22:41:32 瀏覽:223
web聊天源碼 發布:2024-05-02 22:41:29 瀏覽:285
php定時腳本 發布:2024-05-02 22:18:41 瀏覽:312
雲服務可以替代普通伺服器么 發布:2024-05-02 21:57:11 瀏覽:944
wegame與伺服器斷開連接是怎麼回事 發布:2024-05-02 21:55:05 瀏覽:785
zip加密破解 發布:2024-05-02 21:41:23 瀏覽:480
怎麼模擬電腦配置 發布:2024-05-02 21:28:08 瀏覽:784
對一個新編程 發布:2024-05-02 21:20:07 瀏覽:559
華為系統編譯器在哪裡 發布:2024-05-02 21:19:50 瀏覽:86