linux link script symbol export to C

原创 2015年07月08日 14:45:33

有一个需求,就是我需要赋值一段binary到sram. 由于代码本身就跑在sram中,所以,我就想着在link script中定义一块区域用来存放这块binary.

目的有两个,确保,sram有足够的空间来存储。 在link script中, bss之后定义这块区域。

第二是避免这块区域被破坏,将data, text, bss, stack段与这块区域分开。 还有就是范围检测。 sram只有8k,如果最后地址计算超出范围,就让编译失败并告警。


问题来了。 在c 代码中,我需要引用一个地址,就是我在ld文件中定义的buffer起始地址。 比如说ld中:

    __bin_data_start =.;
    .bin_data :   { . += 0x800; }
    __bin_data_end = .;


在C 代码中,要想使用__bin_data_start, 需要用一下方法:

1.extern TYPE __bin_data_start

2. 在引用__bin_data_start的时候前面要加&

比如说赋值: int x = &__bin_data_start;


可以从u-boot中看到类似的用法:

vim asm-generic/sections.h

 11
 12 /* References to section boundaries */
 13
 14 extern char _text[], _stext[], _etext[];
 15 extern char _data[], _sdata[], _edata[];
 16 extern char __bss_start[], __bss_stop[];
 17 extern char __init_begin[], __init_end[];
 18 extern char _sinittext[], _einittext[];
 19 extern char _end[], _init[];
 20 extern char __per_cpu_load[], __per_cpu_start[], __per_cpu_end[];
 21 extern char __kprobes_text_start[], __kprobes_text_end[];
 22 extern char __entry_text_start[], __entry_text_end[];
 23 extern char __initdata_begin[], __initdata_end[];
 24 extern char __start_rodata[], __end_rodata[];


如何使用:

105 static int display_banner(void)
106 {
107     printf("\n\n%s\n\n", version_string);
108     debug("U-Boot code: %08lX -> %08lX  BSS: -> %08lX\n",
109            (ulong)&_start,
110            (ulong)&__bss_start, (ulong)&__bss_end);


具体,建议仔细看看 https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Using_ld_the_GNU_Linker/sections.html

symbols are defined in a linker script file(etext, edata, end)

##以下是man page 里面的内容,源码里面使用的三个外部变量(  extern char etext, edata, end)并未定义在任何头文件里面,而是定义在了linker script f...
  • swedenfeng
  • swedenfeng
  • 2016年12月01日 06:42
  • 251

link script(链接器ld吃的文件)中使用宏定义的解决方案

问题:工作中遇到一个需求:需要在ld script中使用类似C语言的define等宏定义来做一些判断和替换 实验: 1:理论上*.c中都能用,是否gcc也支持在ld script中直接用宏呢,结果: ...
  • ytmayer
  • ytmayer
  • 2015年04月11日 19:34
  • 1770

【C语言】混合编程中的export 、import和extern

【IMPORT 】:   语法格式:   IMPORT 符号 {[WEAK]}   IMPORT 伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能...
  • simanstar
  • simanstar
  • 2014年03月28日 11:18
  • 2483

名字修饰约定extern "C"与extern "C++"浅析

所谓名字修饰约定,就是指变量名、函数名等经过编译后重新输出名称的规则。   比如源代码中函数名称为int Func(int a,int b),经过编译后名称可能为?Func@@YAHHH@Z、?Fu...
  • BeanJoy
  • BeanJoy
  • 2013年06月20日 13:44
  • 8959

Linux驱动开发——EXPORT_SYMBOL的使用

编写C程序时,如果需要使用某个外部的函数,通常的做法是 #include 包含该函数原型(prototype)的头文件,然后在程序中进行调用。经过编译链接后,程序就能顺利调用该函数。但是对于内核模块来...
  • luckydarcy
  • luckydarcy
  • 2016年05月18日 03:46
  • 614

混合编程中的export 、import和extern

http://flashcs3.blog.163.com/blog/static/19972031420133211634888/ 【IMPORT 】:   语法格式:    IMP...
  • u013566722
  • u013566722
  • 2016年08月09日 01:07
  • 594

关于extern和inline的用法

extern 用白话文来讲,就是此处我需要用到函数或者变量,我在其他地方已经声明了,在哪声明的?你只管用就行,不需要知道在哪声明的。 举个...
  • cjh965063777
  • cjh965063777
  • 2016年07月27日 16:18
  • 995

Linux下使用nm命令排查和解决“undefined reference to ”

一、案例      编译出一个动态库.libXXXEngine.so。然后直接在另一个工程中,把头文件include进来,并link到该库:-lXXXEngine. 尝试编译,出错: .//libXX...
  • acs713
  • acs713
  • 2013年10月29日 13:02
  • 9476

link和symbol你真的理解清楚了吗?

为什么会出现LNK2005"符号已定义"的链接错误?   许多Visual C++的使用者都碰到过LNK2005:symbol already defined和LNK1169:one or more ...
  • jeason29
  • jeason29
  • 2015年05月14日 10:08
  • 862

Linux内核—EXPORT_SYMBOL宏的使用

前言 EXPORT_SYMBOL宏的使用时出现在Linux-2.6之后,在Linux-2.4内核中,默认的非static 函数和变量都会自动导入到kernel 空间, 都不用EXPORT_SYMBO...
  • zengxianyang
  • zengxianyang
  • 2016年01月30日 17:41
  • 3652
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux link script symbol export to C
举报原因:
原因补充:

(最多只允许输入30个字)