linux link script symbol export to C

本文详细介绍了如何在Linkscript中定义一块用于存放Binary数据的SRAM区域,确保有足够的空间存储,并避免与其他代码段冲突。通过在C代码中引用此区域的起始地址,实现范围检测和代码布局优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一个需求,就是我需要赋值一段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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值