Linker Special Section Types
转载自http://processors.wiki.ti.com/index.php/Linker_Special_Section_Types#NOLOAD_Sections_2
Introduction
The linker allows you to create different kinds of sections called NOLOAD, DSECT, and COPY sections. How can you create these sections, and what are they good for?
Syntax
You can only create these section types in the SECTIONS directive of a linker command file. This example comes from the Assembly Language Tools User’s Guide …
SECTIONS
{
sec1: load = 0x00002000, type = DSECT {f1.obj}
sec2: load = 0x00004000, type = COPY {f2.obj}
sec3: load = 0x00006000, type = NOLOAD {f3.obj}
}
How are these sections different?
A regular section undergoes four processing steps:
- Allocated: Space is allocated in memory for the section.
- Relocated: Symbols defined in the section are relocated to their final addresses in memory. References to the section from outside are patched according to where the section is allocated. References inside the section to symbols outside the section are similarly patched to the final addresses.
- In Output: The section is placed in the output file.
- Loaded: The section is loaded to the target system.
Steps 1-3 are performed by the linker. Step 4 can be performed with a variety of methods. A section may be loaded by Code Composer Studio during a debug session, or burned into Flash memory, or any number of other methods for loading code or data to a target system.
Sections with these special types avoid one or more of these processing steps.
NOLOAD Sections
NOLOAD sections avoid steps 3 and 4. A NOLOAD section is not included in the output file. Because it is not in the output file, it is not loaded to the target system. Everything else is the same as a regular section.
COPY Sections
COPY sections avoid steps 1 and 4. Space is not allocated in memory for a COPY section. While a COPY section is in the output file, it is not loaded to the target. Everything else is the same as a regular section.
DSECT Sections
DSECT stands for Dummy Section. A DSECT only undergoes step 2, relocation. Space is not allocated in the memory map for a DSECT, nor does it appear in the output file. Thus, a DSECT is not loaded to the target. Any references to symbols in the DSECT are patched as if the section were allocated to the address given for the section. In the example above, the symbols for the DSECT are relocated starting at address 0x2000.
Summary on Section Processing
| Type | Allocated | Relocated | In Output | Loaded |
|---|---|---|---|---|
| Regular | X | X | X | X |
| NOLOAD | X | X | ||
| COPY | X | X | ||
| DSECT | X |
What are these sections good for?
NOLOAD Sections
NOLOAD sections are good for modeling parts of the code or data that are already present in the system. Common examples include code burned into ROM or Flash. The ROM code part of a system could be linked with a command file similar to this …
-a /* guarantee no refs to syms outside ROM */
-r /* partial link - will link again */
rom.obj
-o rom.out MEMORY {
ROM : ...
RAM : ...
} SECTIONS {
rom_sect : { *(.text) } > ROM
}
The resulting rom.out file could be burned in ROM. The final link could use a command file similar to …
rom.out /* code in ROM */
calls_rom.obj /* code that calls code in ROM */
-o calls_rom.out MEMORY { /* must be same as above */
ROM : ...
RAM : ...
} SECTIONS {
rom_sect : type=NOLOAD > ROM
calls_rom : { *(.text) } > RAM
}
The DSECT type could be used in place of NOLOAD. The advantage of NOLOAD is that, since space for the section is allocated in memory, allocations mistakes will be caught by the linker. Such mistakes include allocating too much code to a memory range, or allocating multiple sections to the same memory range. Because DSECT’s are not allocated space in memory, such mistakes go unchecked.
There are several other considerations when creating and linking against a ROM image. The examples above are not comprehensive. The focus is exclusively on explaining NOLOAD.
COPY Sections
COPY sections are rarely created directly by users. They are created automatically by the code generation tools to support various features.
When linking under the --ram_model (–cr) switch for RAM model initialization of global variables in C, the .cinit section is a COPY section. Linking with –-ram_model is similar to the following example
-u _c_int00
-e _c_int00 cinit = -1;
___cinit__ = cinit; SECTIONS {
.cinit {
*(.cinit)
. += 4; /* Mark end with 0 */
} fill = 0, type = COPY
}
The .cinit section is processed by a loader, such as the loader in Code Composer Studio, when loading an output file, to initialize the C global variables. This implies that the loader knows the format of the data contained in the .cinit section.
Program debug information, such as symbol records and source line number information, when organized according to the Dwarf debugging standards, is stored in COPY sections with names such as .debug_info, .debug_line, and .debug_abbrev. These sections are read by the Code Composer Studio in order to support debugging the system.
DSECT Sections
DSECT sections are rarely used. DSECT sections are not allocated to memory. Therefore, they can overlay any other section, whether DSECT or not. Thus, you need to be very careful about their use. It is easy to make a mistake that is hard to find.
Here is one example of the usage of DSECT. A source file contains four functions …
void ram1() { … }
void rom1() { … }
void ram2() { … }
void rom2() { … }
The RAM and ROM functions are separated into distinct sections with names similar to .text:_ram1. The ROM functions are burned into ROM. All of this is done with version X of the tools. After rebuilding with version X+1 of the tools, the sizes and starting addresses of all of the functions, including the ROM functions, is different. But the requirement is that the link must be done against the ROM burned from the previous build. It is possible to get the hard coded addresses of the ROM functions from the previous build. With all of that information, a link command file similar to this would work …
SECTIONS
{
.text:_rom1 : run = 0x1234, type = DSECT
.text:_rom2 : run = 0x5678, type = DSECT
}
Note the hard-coded addresses above are auto-generated from information in the previous build. Details of that process are beyond the scope of this article.
The result is that each ROM section is allocated exactly where it was in the previous build. NOLOAD would work for any function/section that is the same size or smaller than before. But it would not work in the case of a function which is larger. If NOLOAD were used in that case, the linker would complain about the function overlaying the starting address of a later function. Using DSECT, in effect, avoids that check
Linker Special Section Types的更多相关文章
- ELF Format 笔记(三)—— Section Types
ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 ELF 文件中会包含很多 section,所有的 section 都在 section header tab ...
- Android so库文件的区节section修复代码分析
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78818917 一.Android so库文件的节表secion修复方案整理 1.简 ...
- Primitive Data Types
Primitive Data Types (The Java™ Tutorials > Learning the Java Language > Language Basics) http ...
- [译] QUIC Wire Layout Specification - Frame Types and Formats | QUIC协议标准中文翻译(4) 帧类型和格式
欢迎访问我的个人网站获取更好的阅读排版体验: [译] QUIC Wire Layout Specification - Frame Types and Formats | QUIC协议标准中文翻译(4 ...
- YASM User Manual
This document is the user manual for the Yasm assembler. It is intended as both an introduction and ...
- ARM 之一 ELF文件、镜像(Image)文件、可执行文件、对象文件 详解
[转]https://blog.csdn.net/ZCShouCSDN/article/details/100048461 ELF 文件规范 ELF(Executable and Linking ...
- elf.h
1 /* This file defines standard ELF types, structures, and macros. 2 Copyright (C) 1995-2019 Free So ...
- 沁恒CH32V103C8T6(二): Linux RISC-V编译和烧录环境配置
目录 沁恒CH32V103C8T6(一): 核心板焊接和Windows开发环境配置 沁恒CH32V103C8T6(二): Linux RISC-V编译和烧录环境配置 硬件准备 CH32V103 开发板 ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework中的spring web MVC模块
spring framework中的spring web MVC模块 1.概述 spring web mvc是spring框架中的一个模块 spring web mvc实现了web的MVC架构模式,可 ...
随机推荐
- Android开发第1篇 - Android开发环境搭建
归结一下,需要进行Android开发所需要的工具或软件: Eclipse - Android是基于JAVA的开发,所以选用目前来说使用较高的Eclipse作为IDE. ADT (Android Dev ...
- 六,WPF的Application类
Application.ShutdownMode属性:通过,只要有一个窗口还没有关闭,Application类就保持应用程序处于有效状态,如果这不是所期望的行为,就可以调整该属性. 应用程序事件 Ap ...
- MVC4升级MVC5 异常处理
使用过程中的一些烦人的事情,权当这篇文章是MVC4升级MVC5的异常合集吧,后期不定期更新. 在这里你可以看到ASP.NET MVC的发展历程以及你需要的版本和目前最稳定的版本.戳ASP.NET MV ...
- 编写jQuery插件--实现返回顶部插件
国庆过去一周多了,作为IT界的具有严重’工作狂‘性质的宅人,居然还没走出玩耍的心情,拖了程序猿的脚后跟了.最近工作不顺,心情不佳,想吐槽下公司,想了还是厚道点,以彼之道还施彼身,觉得自己也和他们同流合 ...
- 几条特殊的SQL语句
1, 有case情况. select trunc(exf_payment_receipt.work_date),exf_payment_receipt.exchange_code,exf_paymen ...
- Servlet的getContextPath(), getServletPath(), getRequestURI(), getRealPath("/")
假定web application 名称为news,你在浏览器中输入请求路径: http://localhost:8080/news/main/list.jsp 则执行下面向行代码后打印出如下结果: ...
- python 图片上添加数字源代码
最近因工作需要,需要在图片上添加数字,查询了资料,自己写了一个方法,并进行了测试,由于代码用到了PIL库,需要下载安装,下载地址:http://www.pythonware.com/products/ ...
- Java中的编码
package coreJava; import javax.swing.plaf.synth.SynthSpinnerUI; public class EncodeDemo { public sta ...
- sql replace into 与 insert into
sql replace into用法详细说明 REPLACE的运行与INSERT很相似.只有一点例外,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则 ...
- ZOJ 2750 Idiomatic Phrases Game(Dijkstra)
点我看题目 题意 : 给定一本字典,字典里有很多成语,要求从字典里的第一个成语开始,运用字典里的成语变到最后一个成语,变得过程就是成语接龙,后一个成语的第一个字必须有前一个成语的最后一个字相等,给定的 ...