一
当执行make target时如果提示“target is up to date”,表示此时目标target是最新的,没有执行该目标对应的命令。但是要注意的也有可能是执行make所在路径下有个同名文件夹或文件target,使得提示“target is up to date”。
makefile里的编译选项如果是要多个的,要注意的是,比如:
$(LD)-ldrivers platform 应该写成$(LD)-ldrivers -lplatform ,这样才表示连接库文件libdrivers.a和库文件libplatform.a
二
注意如果makefile里的连接脚本XXX.lds里没有指定段 起始段 .startcode,段内容如下,或者指定了起始段 .startcode,但是所有编译路径里的所有文件都没有地址标号Entry,那么即使编译成功了,你也会发现在xxx.map文件里根本就没把main()函数给编译和连接进可执行文件里,因为xxx.map里面的main()是被丢弃的,也就是说main()函数根本没有被编译而是跳过了,因为函数编译的时候是从Entry起一直沿着程序执行流程的编译方向而编译的,也就是说没有被执行到的函数代码很可能就压根没有编译,而是跳过了 。
当然如果指定了 .startcode ,且的的确确有Entry入口,那么编译出来的程序就是正常的了
.startcode :
21 {
22 *init.o (.text)
23 }
24
一下的程序是某个例程的xxx.lds
13 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
14 OUTPUT_ARCH(arm)
15 SECTIONS
16 {
17
18 . = 0x80000000;
19 . = ALIGN(4);
20 .startcode :
21 {
22 *init.o (.text)
23 }
24
25 . = ALIGN(4);
26 .text :
27 {
28 *(.text)
29 }
30
31 . = ALIGN(4);
32
33 .data :
34 {
35 *(.data)
36 }
37
38 . = ALIGN(4);
39
40 _bss_start = .;
41 .bss :
42 {
43 *(.bss)
44 }
45 . = ALIGN(4);
46
47 _bss_end = .;
48
49 _stack = 0x87FFFFF8;
50 }