【IMPORT 】:
语法格式:
IMPORT 符号 {[WEAK]}
IMPORT 伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号,而且不论本源文件是否实际引用该符号,该符号均会被加入到本源文件的符号表中。(与下面的EXTERN的区别之处)
符号在程序中区分大小写, [WEAK] 指定这个选项后,如果符号在所有的源文件中都没有定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该符号。
使用IMPORT伪操作声明一个符号是在其他源文件中定义的。如果连接器在连接处理时不能解析该符号,而IMPORT伪操作中没有指定 [WEAK]选项,则连接器会报告错误。如果连接器在连接处理时不能解析该符号,而IMPORT伪操作中指定了[WEAK]选项,则连接器将不会报告错误,而是进行下面的操作:
1) 如果该符号被B或者BL指令引用,则该符号被设置成下一条指令的地址,该B或者BL指令相当于一条NOP指令
2) 其他情况下该符号被设置为0.
使用示例:
AREA Init , CODE , READONLY
IMPORT Main ;通知编译器当前文件要引用标号Main,但Main 在其他源文件中定义……
END
【EXTERN】:
语法格式:
EXTERN 符号 {[WEAK]}
EXTERN 伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号。如果本源文件没有实际引用该符号,该符号将不会被加入到本源文件的符号表中。
注:与IMPORT的不同之处
使用示例:
AREA Init , CODE , READONLY
EXTERN Main ;通知编译器当前文件要引用标号Main,但Main 在其他源文件中定义……
END
【EXPORT】:
EXPORT_SYMBOL是通过宏,建立一个新的这个函数的入口,包括它址,名称。这个函数会被放到kernel image的__ksymtab section中。当用到这个函数的模块在runtime时被加载的时候,loader就会从__ksymtab section解析这个函数。
使用示例:
AREA adrlabel, CODE, READONLY
IMPORT Good
EXPORT Start
ENTRY
Start
MOV R0,#10 ; 没有用,纯粹为了方便看
B Good
B .
END
这样声明了一个Start的标签提供给外面引用,然后IMPORT声明需要引用一个C语言的Good函数.
【小结】
IMPORT 和EXTERN
EXPORT ,表示本程序里面用到的变量提供给其他模块调用的。