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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

linux中EXPORT_SYMBOL使用

EXPORT_SYMBOL只出现在2.6内核中,在2.4内核默认的非static 函数和变量都会自动导入到kernel 空间的, 都不用EXPORT_SYMBOL() 做标记的。 2.6就必须用EX...

Linux开发心得总结20 - 内核编程中的全局变量使用(EXPORT_SYMBOL())

和我们通常写程序不同,如果仅仅是全局变量,虽然编译内核的时候能连接成功,但是连接之后再就没有办法使用这个变量了 而模块的加载是运行时的,它引用某个变量时,内核需要解析它,否则模块不能工作,EXPOR...
  • ynttmp
  • ynttmp
  • 2012-06-06 09:45
  • 2307

Linux入门(一) -- EXPORT_SYMBOL小结

Linux入门 – EXPORT_SYMBOL小结EXPORT_SYMBOL能够将函数以符号的形式导出给其他模块使用。当使用EXPORT_SYMBOL导出函数之后,我们可以在/proc/kallsym...

EXPORT_SYMBOL linux的内核符号表

http://hi.baidu.com/adokaixin/blog/item/03d79e8822668d8fa5c27263.html   在内核中通过/proc/ka...
  • diy534
  • diy534
  • 2011-11-06 23:58
  • 1558

linux EXPORT_SYMBOL

一个模块mod1中定义一个函数func1;在另外一个模块mod2中定义一个函数func2,func2调用func1。 在模块mod1中,EXPORT_SYMBOL(func1); 在模块mod2中...

Linux中EXPORT_SYMBOL的用法(附:自己的应用)

EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。您还...

Linux内核—EXPORT_SYMBOL宏的使用

前言 EXPORT_SYMBOL宏的使用时出现在Linux-2.6之后,在Linux-2.4内核中,默认的非static 函数和变量都会自动导入到kernel 空间, 都不用EXPORT_SYMBO...

Linux EXPORT_SYMBOL

一个模块mod1中定义一个函数func1;在另外一个模块mod2中定义一个函数func2,func2调用func1。 在模块mod1中,EXPORT_SYMBOL(func1); 在模块mod2中...

Linux内核导出符号宏定义EXPORT_SYMBOL的源码分析

源代码: ……. #ifndef MODULE_SYMBOL_PREFIX #define MODULE_SYMBOL_PREFIX "" #endif ……. struct kernel_symb...

linux的那些事儿之链接脚本(link script)

基础概念 object file——ld链接器的输入文件 executable——ld链接器的输出文件 section——每个节都有名字和大小,大部分节以一块数据区相联系,一个节包含可加载,可分配等属...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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