混合编程中的export 、import和extern

来源:互联网 发布:linux查看根目录命令 编辑:程序博客网 时间:2024/05/01 22:08

http://flashcs3.blog.163.com/blog/static/19972031420133211634888/


【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 ,表示本程序里面用到的变量提供给其他模块调用的。

0 0