__attribute__ ((section(".text")))的测试
一、测试原因
在学习u-boot的环境变量过程中,看到有如此的代码,现对涉及到的内容进行实验测试。
二、测试目的
1、了解gcc允许对段的属性进行更改的方法。
2、解决”ENV_IS_EMBEDDED“解惑以及相关的移植实验中如何将环境变量(结构体变量environment)定位在代码段的0x33f84000的位置,以实现环境变量区嵌入到代码段的功能。
三、测试原理(参考attribute 用法 section 部分)
gcc通过选项__attribute__可以改变所声明或定义的函数、数据的特性。它有很多子项,用于改变作用对象的特性。比如对函数,noline将禁止进行内联扩展、noreturn表示没有返回值、pure表明函数除返回值外,不会通过其它(如全局变量、指针)对函数外部产生任何影响。但这里我们比较感兴趣的是对代码段起作用子项section。
__attribute__的section子项的使用格式为:
__attribute__((section("section_name")))
其作用是将作用的函数或数据放入指定名为"section_name"输入段。
输入段和输出段
输入段和输出段是相对于要生成最终的elf或binary时的Link过程说的。
Link过程的输入大都是由源代码编绎生成的目标文件.o,那么这些.o 文件中包含的段相对link过程来说就是输入段,而Link的输出一般是可执行文件elf或库等,这些输出文件中也包含有段,这些输出文件中的段就叫做输出段。输入段和输出段本来没有什么必然的联系,是互相独立。只是在Link过程中,Link程序会根据一定的规则(这些规则其实来源于Link Script),将不同的输入段重新组合到不同的输出段中,即使是段的名字,输入段和输出段可以完全不同。
需要着重注意的是,__attribute__的section属性只指定对象的输入段,它并不能影响所指定对象最终会放在可执行文件的什么段。
举例如下:
更改变量的段属性
定义的变量var将被放入名为.xdata的输入段,(注意:__attribute__这种用法中的括号好像很严格,这里的几个括号好象一个也不能少。)
int var __attribute__((section(".xdata"))) = ;
更改函数的段属性
这个例子将使函数functionA被放入名叫.xinit的输入段。
static int __attribute__((section(".xinit"))) functionA(void) { .....
}
四、测试代码
测试代码主要是从common/environment.c中摘取的,以测试本应该放在数据段(.data)的environment如何嵌入到代码段。
1、start.S
@******************************************************************************
@ File:crt0.S
@ 功能:通过它转入C程序
@****************************************************************************** .text
.global _start
_start:
bl main @ 调用C程序中的main函数
halt_loop:
b halt_loop
2、main.c
int DATA = ;
int BSS;
const int RODATA = ; int main(void)
{
return ;
}
3、environment.c
#define __PPCENV__ __attribute__ ((section(".text"))) asm (".globl " "env_offset"); //定义全局变量env_offset以供连接脚本调用
asm ("env_offset" " = " "0x04000"); #define CFG_ENV_SIZE 0x2000 //环境变量大小
# define ENV_HEADER_SIZE (sizeof(unsigned long))
#define ENV_SIZE (CFG_ENV_SIZE - ENV_HEADER_SIZE) typedef struct environment_s {
unsigned long crc; /* CRC32 over data bytes */
unsigned char data[ENV_SIZE]; /* Environment data */
} env_t; env_t environment __PPCENV__ = { //将environment的数据段属性更改为代码段
,
"this is in environment!\n"
};
4、environment.lds
SECTIONS {
. = 0x00000000;
. = ALIGN();
.text :
{
start.o (.text);
. = env_offset;
environment.o(.text);
*(.text)
}
. = ALIGN();
.rodata : { *(.rodata) }
. = ALIGN();
.data : { *(.data) }
. = ALIGN();
.bss : { *(.bss) } }
五、测试结果
Disassembly of section .text: <_start>:
: eb0017fe bl <main> <halt_loop>:
: eafffffe b <halt_loop>
... 00004000 <environment>:
: andeq r0, r0, r1
: cmnvc r9, # ; 0x740000
: rsbcss r6, r3, r0, lsr #
400c: 65206e69 strvs r6, [r0, #-]!
: 7269766e rsbvc r7, r9, # ; 0x6e00000
: 656d6e6f strvsb r6, [sp, #-]!
: 0a21746e beq 8611d8 <BSS+0x85b1b8>
... <main>:
: e1a0c00d mov ip, sp
: e92dd800 stmdb sp!, {fp, ip, lr, pc}
: e24cb004 sub fp, ip, # ; 0x4
600c: e3a03000 mov r3, # ; 0x0
: e1a00003 mov r0, r3
: e89da800 ldmia sp, {fp, sp, pc}
Disassembly of section .rodata: <RODATA>:
: andeq r0, r0, r5
Disassembly of section .data: 0000601c <DATA>:
601c: andeq r0, r0, r5
Disassembly of section .bss: <BSS>:
: andeq r0, r0, r0
Disassembly of section .comment:
__attribute__ ((section(".text")))的测试的更多相关文章
- gcc/linux内核中likely、unlikely和__attribute__(section(""))属性
查看linux内核源码,你会发现有很多if (likely(""))...及if (unlikely(""))...语句,这些语句其实是编译器的一种优化方式,具 ...
- 利用__attribute__((section()))构建初始化函数表【转】
转自: https://mp.weixin.qq.com/s?__biz=MzAwMDUwNDgxOA==&mid=2652663356&idx=1&sn=7797629530 ...
- 廖威雄: 思维导图:利用__attribute__((section()))构建初始化函数表与Linux内核init的实现
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/juS3Ve/article/details/79049404 本文具体解说了利用__attribut ...
- arm-none-eabi/bin/ld: build/com.zubax.gnss.elf section `.text' will not fit in region `flash'
出现如下错误: /arm-none-eabi/bin/ld: build/com.zubax.gnss.elf section `.text' will not fit in region `flas ...
- mdk keil 指定变量、函数存储位置,使用 Scatter-Loading Description File, __attribute__(("section“))
0. 数据类型说明 主要包括4类: Code (inc. data) ,属于RO,也就是写的函数代码(包括代码中的变量) RO Data , 属于RO,使用const修饰的变量. RW Data, 属 ...
- 链接加载文件gcc __attribute__ section
在阅读源代码的过程中,发现一个头文件有引用: /** The address of the first device table entry. */ extern device_t devices[] ...
- 8266编译错误 xtensa-lx106-elf/bin/ld: segmentled section `.text' will not fit in region `iram1_0_seg'
一种简单的解决办法 Okay, the solution was to copy the libgcc.a file from: esp-open-sdk/ESP8266_NONOS/lib/ to ...
- ”ENV_IS_EMBEDDED“解惑以及相关的移植实验
一.概述( ENV_IS_EMBEDDED的目的) 经典资料 认识 ENV_IS_EMBEDDED只有在CFG_ENV_IS_IN_FLASH或者CFG_ENV_IS_IN_NAND定义了才有 ...
- Linux 千万不要执行的10个命令
1. rm -rf 命令 rm -rf命令是删除文件夹及其内容最快的方式之一.仅仅一丁点的敲错或无知都可能导致不可恢复的系统崩坏.下列是一些rm 命令的选项. rm 命令在Linux下通常用来删除文件 ...
随机推荐
- CentOS7.0分布式安装HADOOP 2.6.0笔记-转载的
三台虚拟机,IP地址通过路由器静态DHCP分配 (这样就无需设置host了). 三台机器信息如下 - 1. hadoop-a: 192.168.0.20 #master 2. ha ...
- memcached与redis 对比
一. 综述 读一个软件的源码,首先要弄懂软件是用作干什么的,那memcached和redis是干啥的?众所周知,数据一般会放在数据库中,但是查询数据会相对比较慢,特别是用户很多时,频繁的查询,需要耗费 ...
- 纪录参加noip2015(pj+tg)复赛
作为一个既参加了pj又参加了tg的初三蒟蒻,本次复赛不得不算一次很happy的事(可以不做周末作业,可以逃掉小班培训) 昨年参加pj的时候,一题眼瞎,二题作死,只有三题蒙了一点分,简直差到一种境界. ...
- gitlab hooks
之前一直用文件同步工具进行两台服务器之间的同步 最初的目的是吧gitlab的代码库同步到开发环境中运行 实时的 ,后来由于gitlab的代码仓库的代码不是实时的 于是在即使同步不适合 我的需求. 后来 ...
- 初步掌握HDFS的架构及原理
目录 HDFS 是做什么的 HDFS 从何而来 为什么选择 HDFS 存储数据 HDFS 如何存储数据 HDFS 如何读取文件 HDFS 如何写入文件 HDFS 副本存放策略 Hadoop2.x新特性 ...
- iOS-设置状态栏白色以及覆盖状态栏
iOS-设置状态栏白色以及覆盖状态栏 将状态栏设置为白色 首先, 在info.plist中添加一个标记. View controller–based status bar appearance键值设置 ...
- [转] Bound Service的三种方式(Binder、 Messenger、 AIDL)
首先要明白需要的情景,然后对三种方式进行选择: (一)可以接收Service的信息(获取Service中的方法),但不可以给Service发送信息 (二) 使用Messenger既可以接受Servic ...
- 十个最好的Java性能故障排除工具
1.jconsole 是随着JDK 1.5而推出的.这是一个Java监测和管理控制台-JMX兼容的图形工具来监测Java虚拟机.它能够同时监测本地和远程的JVMs.详情可查看:jconsole工具介 ...
- 一致性哈希(Consistent Hash)
http://blog.csdn.net/cywosp/article/details/23397179/ http://www.codeproject.com/Articles/56138/Cons ...
- linux的openfire运行日志配置经历
openfire的日志可以通过/usr/openfire/lib/log4j.xml(与openfire的安装目录有关,我的openfire是安装在/usr/openfire/)的xml配置文件进行设 ...