Sunplus DVD软件Makefile详解(四)
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
根目录Makefile
1 #
2 # Makefile
3 #
4
5 PATH := $(PATH) .
6 VPATH = DSP3 MIPS IR_VFD IOP SETUP mcu_protocol
7
8 .SUFFIXES:
9 .PHONY: force
10
11 sinclude Makefile.utl
12
13 LIBDIR = mipsel-elf
14 LIBPPCMDIR = mipsel-elf-ppcm
15 LIBAACDIR = mipsel-elf-aac
16 #LIBWMADIR = mipsel-elf-wma
17 LIBDTSDIR = mipsel-elf-dts
18 LIBSRVDIR = srv-elf
19 GOAL = romL.obj
20 LDSCRIPT = dvdL.ld
21 CFLAGS_ENDIAN = -DLITTLE_ENDIAN
22
23 INIT0 = MIPS/init0.o
24 ROMINIT0 = MIPS/rominit.o
25 ROMFINIT0 = MIPS/romfinit.o
26 CRT0 = MIPS/crt0.o
27
28 INCLUDE_DIR = -<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />I. -Ih/ -Iosd/ -Isetup/ -Iemu/ -Inav/ -Iauth/ \
29 -Iservo/ -Ichinese/ -Iir_vfd/ -Ipeif/ -Igame/ \
30 -Isystem/ -Iauddrv/ -Imcu_protocol/
31
32 # generic flags
33 CFLAGS_SUPPORT = -D__EMU__ -DFINALSYS
34 CFLAGS_SIM =
35 CFLAGS_COMPILE = $(CFLAGS_SUPPORT) $(CFLAGS_SIM)
36
37 # CFLAGS_CPPX
38 # for dvdL.ldp parsing
39 CFLAGS_CPPX = $(CFLAGS_COMPILE) -I. -Ih -x c++
40
41 # ld related flags (LDFLAGS)
42 LIBRARIES =
43 LDFLAGS_LIB =
44 LDFLAGS = -nostartfiles -T $(LDSCRIPT) -L$(LIBDIR) -L$(LIBPPCMDIR) \
45 -L$(LIBAACDIR) -L$(LIBDTSDIR) -L$(LIBSRVDIR) $(LDFLAGS_LIB) \
46 --cref -Wl,--gc-sections,--sort-common,-Map,$*.map
47
48 # Sources
49 SOURCES_IOP = \
50 iop.c \
51 ioprom.c \
52
53 SOURCES_AUD = \
54 dsp3_config.c\
55 dsp3_intr.c \
56 DSP3Codec.c \
57
58 SOURCES = \
59 ap_main.c \
60 emuio.c \
61 databuf.c \
62 membuf.c \
63 membufv.c \
64 c_i2c.c \
65 gpio.c \
66 card_media.c \
67 usb_media.c \
68 disc_media.c \
69 fs_file_ext_info_tab.c\
70 fs_ui.c\
71 resume_util.c \
72 sp_nvmem.c \
73 flash_if.c \
74 shuffle_new.c \
75 car_mcu.c\
76 $(SOURCES_IOP) \
77 $(SOURCES_AUD) \
78
79 SOURCES_S = intdrv.S
80
81 DEPENDS_C = \
82 $(addprefix MIPS/,$(SOURCES:.c=.d))
83
84 DEPENDS_S = \
85 $(addprefix MIPS/,$(SOURCES_S:.S=.d))
86
87 DEPENDS = $(DEPENDS_C) $(DEPENDS_S)
88 OBJS = $(DEPENDS:.d=.o)
89
90 # main target
91 all: $(GOAL)
92 @$(CHKSUM) romL.bin 64
93 @$(XB2) 0x70 romL.bin rom.bin
94 @$(CHKSUM) rom.bin 32
95 @$(ECHO) \"all made\"
96
97
98 # dvdL.ld
99 dvdL.ld: dvdL.ldp force
100 @$(ECHO) \"generate linker script\"
101 @$(CPP) $(CFLAGS_CPPX) dvdL.ldp > dvdL.ld
102
103 # GOAL
104 $(GOAL): %.obj: $(LIBRARIES) $(OBJS) $(INIT0) $(CRT0) \
105 $(ROMINIT0) $(BOOT_FLASH) dvdL.ld
106 @$(ECHO) \"linking..\"
107 @$(XCC) $(CFLAGS_MIPS) -o $@ $(INIT0) $(OBJS) $(CRT0) \
108 $(ROMINIT0) $(BOOT_FLASH) $(LDFLAGS)
109 @$(ECHO) \"dumping..\"
110 @$(XOBJDUMP) -j .rom1 -s $@ > $*.dump
111 @$(XOBJDUMP) -j .ram1 -s $@ >> $*.dump
112 @$(XOBJDUMP) -j .rom2 -s $@ >> $*.dump
113 @$(XOBJDUMP) -j .drv_iop -s $@ > iop.dump
114 @$(XOBJDUMP) -j .drv_iop_rst -s $@ > iop_rst.dump
115 @$(XOBJDUMP) -j .drv_ap1 -s $@ > ap1.dump
116 @$(DUMP2BIN) iop.dump iop.bin
117 @$(FGZIP2) -f iop.bin
118 @$(DUMP2BIN) iop_rst.dump iop_rst.bin
119 @$(FGZIP2) -f iop_rst.bin
120 @$(DUMP2BIN) ap1.dump ap1.bin
121 @$(FGZIP2) -f ap1.bin
122 @$(ECHO) \"packaging..\"
123 @$(DUMP2BIN) $*.dump $*.bin
124 @$(MODUAL) $*.bin ap1.bin.gz iop.bin.gz iop_rst.bin.gz
125
126 %.dis : %.obj
127 @$(ECHO) \"disassembling..\"
128 @$(XOBJDUMP) --disassemble -j .rom1 --source $< > $@
129
130 # special commands.
131 MIPS/init0.o : user_init.h
132 MIPS/init0.o : init0.S ./h/regmapa.h ./h/sdctrl.h ./sdram.h
133 MIPS/crt0.o : crt0.S ./h/regmapa.h ./h/sdctrl.h ./user_init.h ./sdctrl.inc
134 MIPS/boot_flashs.o : boot_flashs.S ./h/regdef.h
135
136 ifneq ($(MAKECMDGOALS),clean)
137 ifneq ($(MAKECMDGOALS),tar)
138 ifneq ($(MAKECMDGOALS),bak)
139 sinclude $(DEPENDS)
140 endif
141 endif
142 endif
143
5)将当前目录(.)加入系统路径变量PATH。
6)定义输入文件的搜索路径。
13~18)定义各种库文件的搜索路径
19)定义总的目标文件名romL.obj。
20)定义链接脚本文件名dvdL.ld。
23~26)定义启动代码的相关的目标文件。它们的依赖关系定义在第130~134行。源代码是汇编语言(.S),编译命令定义在核心Makefile(Makefile.ult)的第107~109行,编译生成.o文件。
44~46)定义链接命令参数。-T指定链接脚本文件;-L指定链接库路径;-Map指定生成的map文件。
48~79)列举所有输入文件,其中包括.c和.S文件。
81~88)指定所有输入文件对应的依赖文件(.d)和目标文件(.o)。它们的编译命令前面已经介绍过了。
98~101)定义链接脚本文件的依赖关系和生成命令。dvdL.ldp文件经cpp预处理后生成dvdL.ld文件,dvdL.ld才是链接命令使用的脚本文件。dvdL.ldp只是便于阅读和管理而建立的。
103~108)定义总目标文件的依赖关系和编译命令。首先将所有.c和.S文件编译成对应的.o文件,然后链接成总目标文件romL.obj。这是ELF格式文件。
110~112)将section .rom1、.ram1和.rom2的全部内容依次串接起来,输出到$*.dump文件(romL.dump)。
113~115)将section .drv_iop、.drv_iop_rst和.drv_ap1的全部内容分别输出到文件iop.dump、iop_rst.dump和ap1.dump。下面节选romL.dump文件中的部分内容。很直观的看出每个section的内容及其地址。
romL.obj: file format elf32-littlemips
Contents of section .rom1:
88000000 cdab4234 00000000 85000010 00000000 ..B4............
88000010 0800e003 00000000 00000000 00000000 ................
88000020 00000000 00000000 00000000 00000000 ................
……
88003580 00000000 23100200 08006001 00000000 ....#.....`.....
88003590 2158e003 21508000 530d000e 00000000 !X..!P..S.......
880035a0 21108000 f5ff0010 00000000 00000000 !...............
romL.obj: file format elf32-littlemips
Contents of section .ram1:
80000000 696e6974 69616c20 6f6b0000 00000000 initial ok......
romL.obj: file format elf32-littlemips
Contents of section .rom2:
880035c0 4c697474 6c652065 6e646961 6e0a0000 Little endian...
880035d0 25730a00 74657374 0a000000 30782578 %s..test....0x%x
880035e0 0a000000 25640a00 74657374 206f6b00 ....%d..test ok.
……
116~123)将各个.dump文件通过工具dump2bin处理分别生成各自对应的.bin文件。然后各.bin文件再经过压缩工具fgzip2处理生成同名.bin.gz文件。但是romL.bin除外,它不经压缩工具处理,原因在接下来的内容中会给予说明。下面是romL.dump处理后生成的romL.bin,是二进制文件,用UltraEdit打开,看到如下。容易看出,它是将romL.dump中的各个section内容依次连接在一起。
00000000 CD AB 42 34 00 00 00 00 85 00 00 10 00 00 00 00 瞳B4....?......
00000010 08 00 E0 03 00 00 00 00 00 00 00 00 00 00 00 00 ..?............
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
……
00013696 00 00 00 00 23 10 02 00 08 00 60 01 00 00 00 00 ....#.....`.....
00013712 21 58 E0 03 21 50 80 00 53 0D 00 0E 00 00 00 00 !X?!P€.S.......
00013728 21 10 80 00 F5 FF 00 10 00 00 00 00 00 00 00 00 !.€.?..........
00013744 69 6E 69 74 69 61 6C 20 6F 6B 00 00 00 00 00 00 initial ok......
00013760 4C 69 74 74 6C 65 20 65 6E 64 69 61 6E 0A 00 00 Little endian...
00013776 25 73 0A 00 74 65 73 74 0A 00 00 00 30 78 25 78 %s..test....0x%x
00013792 0A 00 00 00 25 64 0A 00 74 65 73 74 20 6F 6B 00 ....%d..test ok.
……
90~95)定义默认目标的依赖关系和处理命令。$(GOAL)是它的依赖,因此,上面我们已经介绍过的目标$(GOAL)会在它之前得到执行,生成romL.bin。这里的三条处理命令是对romL.bin加入checksum和加密(xb2)后生成rom.bin文件。加密命令xb2似乎只是将romL.bin中一段内容与一个数据序列进行异或运算(xor)。如果这里只是异或运算的话,只要将xb2生成的文件再进行一次相同的xb2处理就能还原该文件,这里没有深入研究过。其实不经过这三条命令处理,得到的romL.bin也能运行。
124)将前面生成的各模块.bin文件按顺序合成一个romL.bin文件
126~128)用于反编译romL.obj。这里仅对section .rom1进行反编译。利用反编译查找系统死机位置非常精确。当不明原因引起死机时,调试任务会将系统当前各种信息打印出来。其中就包括EPC寄存器值,这是异常发生时的程序指针(异常返回地址),在反编译的文件中查找EPC指向的地址,就知道系统死机的位置了。
『未完,待续...』
文章评论(0条评论)
登录后参与讨论