Linker script 链接器脚本(1)

[随笔]GNU linker script,ld script,GNU链接脚本 [随笔]GNU linker script,ld script,GNU链接脚本注,此文部分内容摘抄自网络,博主(itxiebo)主要的贡献是整理编辑等。一、什么是GNU linker script?作用是什么?.lds文件,即linker script,决定了可执行映像(image)的链接方式,以及各个段的装载地址(装载域)和执行地址(运行域)。 装载地址:运行之前各段的地址; 运行地址:运行时各段 阅读详情

每个链接都由链接脚本控制着,脚本由链接器命令语言组成。脚本的主要目的是描述如何把输入文件中的节(sections)映射到输出文件中,并控制输出文件的存储布局。大多数的链接脚本就是做这些事情的,但在有必要时,脚本也可以指导链接器执行一些其他的操作。
链接器总是使用链接器脚本,如果你没有提供一个你自己的脚本文件的话,编译器会使用一个缺省的脚本,而它被编译进链接器(?)。你可以使用"-verbose"命令行参数来显示缺省的链接脚本。而某些命令行选项,像"-r","-N"会影响缺省的链接脚本。
在命令行选项中,通过参数"-T"你可以提供你自己的链接器脚本,这样就会替换缺省的脚本了。
你还可以隐式地使用脚本,只要给一个脚本文件命名,并作为输入文件提交给链接器,就像是它们都是要被链接的文件一样。具体的内容清查看第11节。以下是目录:
1 Basic Linker Script Concepts
2 Linker Script Format
3 Simple Linker Script Example
4 Simple Linker Script Commands
5 Assigning Values to Symbols
6 SECTIONS command
7 MEMORY command
8 PHDRS Command
9 VERSION Command
10 Expressions in Linker Scripts
11 Implicit Linker Scripts


1 基本的链接器脚本的概念
这里我们会定义一些基本的概念和一些词汇,来描述链接器脚本语言。
链接器把一些输入文件联合在一起,生成输出文件。输出的文件和输入文件都是object文件格式,每个文件都被称为对象文件(object file),而且,输出文件还经常被称为可执行文件。但这里我们依然称之为对象文件。每个对象文件在其中都包含有一个节(section)列表,我们有时称输入文件中的节(section)为输入节(input section),同样,输出文件中的节称为输出节(output section)。
对象文件中的每一个节都有名字和大小。大多数的节还有一个相连的数据块,就是有名的"section contents"。一个被标记为可加载(loadable)的节,意味着在输出文件运行时,contents可以被加载到内存中。没有contents的节也可以被加载,实际上处了一个数组被设置外,没有其他的东西被加载(在一些情况下,存储器必须被清0)。而既不是可加载的又不是可分配的(allocatable)节,通常包含了某些调试信息。
每个可加载或可分配的输出节(output section)都有2个地址。第一个是虚拟存储地址VMA(virtual memory address),这是在输出文件执行时该节所使用的地址。第二个是加载存储地址LMA(load memory address),这是该节被加载是的地址。在大多数情况下,这两个地址是相同的。有个例子说明不同时的情况:当一个数据节(data section)加载在ROM中,后来在程序开始执行时又拷贝到RAM中(在基于ROM的系统中,这种技术经常用在初始化全局变量中)。在这种基于ROM的系统情况下,这时,ROM地址是LMA,而内存地址是VMA。
要查看一个对象文件中各个节,可以使用objdump,并使用"-h"参数。
每个对象文件也有一个符号(symbles)列表,这就是著名的符合表(symble table)。一个符号可以是"已定义"(defined)或"无定义"(undefined)的。每个符号有名字,并且每个定义了的符号还有地址。在你编译一个c/c++程序成对象文件时,每个定义的函数,全局变量,静态变量,都可以有一个"已定义"的符号。输入文件中引用的每个没有定义的函数和全局变量则变成"无定义"的符号。
使用nm可以查看对象文件中的符合,objdump并使用"-t"选项也可以。

2 链接器脚本格式
链接器脚本是一个文本文件。
链接器脚本是一个命令序列,每个命令是一个关键字,可能还带着参数,又或者是对一个符号的赋值。你可以使用分号来隔开命令,而空格则通常被忽略。
像文件名,格式名等字符串通常直接输入,如果文件名包含有像用于分割文件名的逗号等有其他用处的字符的话,你可以用双引号把文件名括起来。当然没有办法在文件名中使用双引号了。
你可以使用注释,就像在C中,定界符是"/*"和"*/",和C中一样,注释在语法上等同于空格。

3 简单的脚本例子
很多的了解脚本都比较简单。可能最简单的链接器脚本只有一个命令: 'SECTIONS'。使用'SECTIONS'命令描述输出文件的内存布局。
'SECTIONS'命令功能强大。这里描述一个简单的使用。我们假设你的只有代码(code),初始数据(initialized data)和未初始化的数据(uninitialized data)。它们要分别被放到'.text', '.data', '.bss'节中。更进一步假定它们是输入文件中的所有的节。
这个例子中,代码要加载到地址0x10000,数据要从地址0x8000000开始。链接脚本如下:
SECTIONS
{
  . = 0x10000;
  .text : { *(.text) }
  . = 0x8000000;
  .data : { *(.data) }
  .bss : { *(.bss) }
}
'SECTIONS'命令的关键字是'SECTIONS',接着是一系列的符号(symbol)赋值,输出节(output section)描述被大括号包括着。
上面例子中,在'SECTIONS'命令里面,第一行设置一个值到一个特殊的符号'.',它是位置计数器(location counter),(像程序计数器PC)。如果你没有以某种其他的方式指定输出节(output section)的地址,地址就会是位置计数器中设置的当前值。而后,位置计数器就会以输出节的大小增加其值。在'SECTIONS'命令的开始,位置计数器是0。
第2行定义'.text'输出节。冒号是必须的语法。在大括号里,输出节名字之后,你要列出要输入节的名字,它们会放入输出节中。通配符"*"匹配任何文件名,表达式"*(.text)"意味着所有的输入文件中的输入节".text"。
因为在输出节".text"定义时,位置计数器是0x10000,所以链接器会设置输出文件中的".text"节的地址为0x10000。
剩下的行定义输出文件中的".data"和".bss"节。链接器会把输出节".data"放置到地址0x8000000。之后,链接器把输出节".data"的大小加到位置计数器的值0x8000000, 并立即设置".bss"输出节,效果是在内存中,".bss"节会紧随".data"之后。
链接器会确保每个输出节都有必要的对齐,它会在需要是增加位置计数器的值。在上面的例子中,指定的".text"和".data"节的地址都是符合对齐条件的,但是链接器可能会在".data"和".bss"间生成一个小间隙。
4 简单的链接器脚本命令
这里我们会描述简单的链接器脚本命令
4.1 Setting the entry point
4.2 Commands dealing with files
4.3 Commands dealing with object file formats
4.4 Other linker script commands

4.1 设置入口点
在一个程序中第一个指令称为入口点(entry point)。可以使用ENTRY链接器脚本命令来设置入口点。参数是一个符号名。
ENTRY(symbol)
有几种不同的方式来设置入口点。链接器会依次用下面的方法尝试设置入口点,当遇到成功时则停止。
  命令行选项"-e"  entry
  脚本中的"ENTRY(symbol)"
  如果有定义"start"符号,则使用start符号(symbol)。
  如果存在".text"节,则使用第一个字节的地址。
  地址0。

4.2 处理文件的命令
有一些处理文件的命令:
  INCLUDE filename
在该点包含名称filename的链接脚本文件。文件会在当前路径下进行搜索,还有通过选项"-L"指定的目录。可以进行嵌套包含,你可以最多嵌套10层。
  INPUT(file,file,…)  或  INPUR(file file …)
INPUT命令指示链接器在链接中包含指定的文件,好像它们命名在命令行上一样。
例如,如果你总是要在链接时包含"subr.o",但是你又不想很烦地每次在命令行上输入,你可以在你的链接脚本中使用"INPUT(subr.o)"。
实际上,如果你喜欢,你可以在链接脚本中列出所有的输入文件,然后使用选项"-T"来调用链接器,而不用做其他的。
链接器首先尝试打开当前目录下的文件,如果没有,就通过存档库搜索路径进行搜索。你可以查看"-L"选项说明。
如果你使用`INPUT(-l file)`,ld会把它转化成libfile.a,就想在命令行中使用"-l"参数。
当你在一个隐式链接脚本中使用"INPUT"命令时,在链接器脚本文件被包含的点,文件会被包含进去。这会影响文档(archive)的搜索。
  GROUP( file, file, …)     GROUP(file file …)
GROUP命令类似于INPUT命令,处了其文件为文档archive外。它们会被重复搜索,知道没有新的无定义(undefined)引用被创建。请查看"-("参数的描述。
  OUTPUT(filename)
该命令指定输出文件的名字。相当于命令行中的`-o filename`参数。如果都使用了,命令行选项会优先。
可以用OUTPUT命令来定义一个缺省的输出文件名,而不是无用的缺省`a.out`。
  SEARCH_DIR(path)
此命令添加路径path到ld搜索库文档achive的路径列表中。相当于命令行方式下的`-L path`。如果都设置了,则都添加到列表中,而且,命令行中的在前,优先搜索。
  STARTUP(filename)
此命令和INPUT命令相似,处了filename会成为第一个被链接的输入文件外,就想在命令行上被第一个输入。如果处理入口点总是第一个文件的开始,在这样的系统中,这会很有用。
4.3 处理对象文件(object file)格式的命令
处理对象文件格式的命令只有2个。
  OUTPUT_FORMAT(bfdname)   OUTPUT_FORMAT(default, big, little)
此命令为用户的输出文件命名BFD 格式。相当于命令行中使用选项`--oformat bfdname`,如果都使用了,命令行方式优先。
可以使用3个参数的OUTPUT_FORMAT指令,指定使用的不同的格式,就像命令行方式下的选项`-EB`, `-EL`。这样允许链接器脚本设置输出格式是指定的endianness编码。
如果没有使用`-EB`或`-EL`指定endianness,输出格式会是第一个参数default。如果使用`-EB`,那么使用第二个参数big,使用了`-EL`,则使用参数little。
例如,目标MIPS ELF 使用的缺省链接脚本使用命令:
OUTPUT_FORMAT(elf32-bigmips, elf32-bigmips, elf32-littlemips)
这就是说,输出的缺省格式是elf32-bigmips,但是如果用户在命令行指定了选项`-EL`,则使用elf32-littlemips。
  TARGET(bfdname)
当读取输入文件时,此命令为用户命名BFD格式。它会影响随后的INPUT和GROUP命令。此命令相当于命令行方式的选项`-b bfdname`。 如果使用了TARGET命令,而没有使用OUTPUT_FORMAR,那么最后的TARGET命令也设置输出文件的格式。
4.4 其它的链接器脚本命令
有一些其他的脚本命令:
  ASSERT(exp, message)
确保表达式exp非零。如果为0,则退出链接,返回错误码,打印指定的消息message。
  EXTERN(symbol symbol …)
强制要进入输出文件的指定的符号成为无定义undifined的符号。这么做,可以触发从标志库对附加模块的链接。可以列出多个符号symbol。对每个EXTERN,你可以使用EXTERN多次。这个命令和命令行下的选项`-u`产生一样的效果。
  FORCE_COMMON_ALLOCATION
此命令的效果和命令行的选项`-d`一样,让ld 分配空间给公共common的符号,即使通过选项`-r`指定的是一个重定位的输出文件。
  INHIBIT_COMMON_ALLOCATION
此命令和命令行选项`--no-define-common`有同样效果:让ld忽略对公共符号的赋值,即使是一个非可重定俍的(non-relocatable)输出文件
  NOCROSSREFS(section section …)
此命令也许可以用来告诉ld在指定的输出节中对任何的引用发出一个错误。
在某些特别类型的程序中,特别是嵌入式系统,如果使用覆盖图overlays,当一个节加载到内存中,而另一个节不在。这两个节间的任何方向的引用都会出错,例如,一个节中的代码调用另一个节中的函数。
NOCROSSREFS命令带有一个输出节名字列表。如果ld测试在这些节之间有任何的交叉引用,就会报告一个错误,并返回一个非0的状态。
注意,此指令使用的时输出节,而不是输入节。
  OUTPUT_ARCH(bfdarch)
指定一个特定的机器架构输出。参数是BFD库中使用的名字。可以使用objdump 指定参数选项`-f`来查看架构。如ARM

Linker Script,LMA,VMA 以前在学ld的script时两个比较重要的概念,即指定一个输出section的lma和vma(分别是load memory address和virtual memory address),vma的作用比较明显,但lma有什么用呢?恩,对在linux这样的操作系统的应用程序来说,是没什么用的,毕竟应用程序都是被'load'到虚拟地址空间中。但是在嵌入式底层firmware, os kernel开发来说, 阅读详情

相关推荐

嵌入式开发中的链接脚本(Linker Script)详解与应用

链接脚本(Linker Script)是嵌入式系统开发中的关键配置文件,它定义了程序在存储器中的布局方式。从技术原理上看,链接脚本通过MEMORY指令描述物理存储空间,用SECTIONS指令控制代码段(.text)、数据段(.data)等的内存映射。在STM32等ARM架构MCU开发中,合理配置链接脚本能优化内存使用、提升执行效率,特别是处理中断向量表、多存储区域管理等场景。现代嵌入式系统常面临存储异构性、地址强约束等挑战,如I.MX RT系列需要特殊配置FlexSPI接口,而TrustZone安全扩展则需

weixin_29164843的博客 225

链接脚本(Linker Scripts)语法和规则解析(翻译自官方手册)

原链接:链接脚本(Linker Scripts)语法和规则解析(翻译自官方手册)_BSP-路人甲的博客-优快云博客_链接脚本语法  为了便于与英文原文对照学习与理解(部分翻译可能不准确),本文中的每个子章节标题和引用使用的都是官方手册英文原称。命令及命令行选项统一使用斜体书写。高频小节会用蓝色字体标出。 3 Linker Scripts 每个链接都由一个链接脚本控制。该脚本使用链接器命令语言编写。 链接脚本的主要目的是描述如何将输入文件中的各个部分映射到输出文件中,并控制输出文件的内存布局。大多数

团长的专栏 8452

gnu ld 说明书

lds 说明书 看懂linux源代码,学习linux内核必须的

链接脚本(Linker Script)解析

链接脚本实质上是一个规则文件,程序员用来指挥链接器工作的,当我们编写了多个C文件,调用了大量库,如何编译成一个可执行文件呢?这是链接脚本文件就会发挥他的作用了:将多个目标文件(xx.o)、库文件(xx.a)、动态库(.so)等等链接成一个可执行文件。

保持一颗永远好奇、勇于探索的心 1万+

Windows Server 搭建ftp服务

Windows Server 搭建ftp服务

ch258563的博客 1010

从USB相机标定到Aruco码精准定位:基于aruco-ros的机器人视觉实践

本文详细介绍了基于aruco-ros的机器人视觉实践,从USB相机标定到Aruco码精准定位的全流程。通过实战案例和优化技巧,展示了Aruco码在机器人导航中的高精度位姿识别能力,帮助开发者快速实现毫米级视觉定位系统。

weixin_27310417的博客 487

GNU ld 链接脚本(Linker Script)简介

表2. 指定目标文件格式的链接脚本命令命令格式意义备注输出文件的格式与命令行选项--oformat bfdname同义输出文件的格式与选项-EB -EL有关指定输入文件的BFD格式与命令行选项-b bfdname同义表示指定输出文件的格式默认为elf32-i386,如果使用链接选项-EB,则选择大端模式的输出格式elf32-i386,如果使用链接选项-EL,则选择小端模式的输出格式elf32-i386。这个例子中三个输出格式的名称是一样,当然也可以指定为不同的值。

3668

告别天价授权!手把手教你用TwinCAT 3.1搭建EtherCAT主站(Windows 10/11保姆级教程)

本文详细介绍了如何在Windows 10/11系统上使用TwinCAT 3.1免费搭建EtherCAT主站,帮助中小企业和个人开发者低成本实现工业自动化。从环境准备、许可证策略到安装配置和实战开发,提供保姆级教程,涵盖PLC编程、运动控制及硬件选型建议,助您轻松入门工业控制领域。

weixin_30664615的博客 360

[LinkerScript.3] 简单的链接器脚本实例 - Simple Linker Script Example

Many linker scripts are fairly simple. 很多链接器脚本都有相应的简单. The simplest possible linker script has just one command: ‘SECTIONS’. You use the ‘SECTIONS’ command to describe the memory layout of the o

Vanquisher 702

Basilisk vs. STK:开源航天仿真工具在Windows上的实战体验与生态对比

本文对比了开源航天仿真工具Basilisk与商业软件STK在Windows平台上的实战体验与生态差异。从技术架构、安装配置、使用成本、功能覆盖、社区生态到适用场景,全面分析了二者的优劣势,为航天工程师和研究人员提供选型参考。Basilisk在性能和扩展性上表现突出,而STK在可视化与专业模块上更具优势。

weixin_30632089的博客 588

突发E层(Es层):短波通信中的“意外惊喜”与“隐形杀手”全解析

本文深入解析了突发E层(Es层)在短波通信中的双重作用,既可能带来超远距离通信的“意外惊喜”,也可能成为通信链路的“隐形杀手”。通过分析Es层的形成机制、时空分布规律及实战应用技巧,帮助通信爱好者与专业人员更好地利用或应对这一电离层现象,提升短波通信的可靠性与效率。

weixin_30443813的博客 822

嵌入式链接脚本(Link Script)介绍

1. 概论每一个链接过程都由链接脚本(linkerscript, 一般以lds作为文件的后缀名)控制. 链接脚本主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局. 但你也可以用连接命令做一些其他事情.连接器有个默认的内置连接脚本, 可用ld--verbose查看. 连接选项-r和-N可以影响默认的连接脚本(如何影响).-T选项用以指定自己的

朝气蓬勃 6499

【ubuntu】【VirtualBox】VirtualBox无法加载USB移动设备的解决方法(支持U盘启动盘)

提示:测试可用。

联系方式:927632640 2440

[LinkerScript.1] 基本的链接器脚本概念 - Basic Linker Script Concepts

We need to define some basic concepts and vocabulary in order to describe the linker script language. 为了描述链接器脚本语言,我们需要定义一些基本的概念和词汇. The linker combines input files into a single output file. The

Vanquisher 596

OCR技术解析:用Tesseract和PaddleOCR识别文本

OCR技术解析:用Tesseract和PaddleOCR识别文本 ,人工智能,计算机视觉,大模型,AI,光学字符识别(Optical Character Recognition,简称 OCR)是一项将图片、扫描件等文档中的文字信息转换为可编辑文本的技术。在数字化时代,OCR 技术广泛应用于文档处理、车牌识别、身份证识别、古籍数字化等领域,极大地提高了文字信息处理的效率。Tesseract 和 PaddleOCR 是两款极具代表性的 OCR 工具。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 3万+

模型实战(31)之 yolo26 实现对手部关键点数据集 的训练与关键点检测

模型实战(31)之 yolo26 实现对手部关键点数据集 的训练与关键点检测

yohnyang的博客 209

[001] [RISC-V] Linker Script 链接脚本说明

每个输出section都有一个类型,如果没有指定TYPE类型,那么连接器根据输出section引用的输入section的类型设置该输出section的类型。一个可执行文件中的所有符号都有自己的地址,并保存在「全局符号表」中,但此时「全局符号表」中的地址还都是原来在各个目标文件中的地址,即相对于零地址的偏移。表示当前地址,它是一个变量,总是代表输出文件中的一个地址(根据输入文件section的大小不断增加,不能倒退,且只用于。来描述,包括段名、段的类型、段的起始地址、段的偏移和段的大小等。

柯西的彷徨的博客 6046

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Linker Script 和 Linker Map File

Linker ScriptLinker Map FileLinker ScriptLinker Map FileLinker ScriptLinker Map File相同点不同点

m0_59091453的博客 879

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

转:链接器脚本(linker script)

<br />       每个链接都由链接脚本控制着,脚本由链接器命令语言组成。脚本的主要目的是描述如何把输入文件中的节(sections)映射到输出文件中,并控制输出文件的存储布局。大多数的链接脚本就是做这些事情的,但在有必要时,脚本也可以指导链接器执行一些其他的操作。<br />链接器总是使用链接器脚本,如果你没有提供一个你自己的脚本文件的话,编译器会使用一个缺省的脚本,而它被编译进链接器(?)。你可以使用"-verbose"命令行参数来显示缺省的链接脚本。而某些命令行选项,像"-r","-N"会影响缺

tenfyguo的技术专栏 1537

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

链接脚本文件-Linker script file

连接器(Linker)会将一个或多个生成的目标文件合并成一个可执行文件。 如一个程序中,会存在若干个模块,每个模块编译会生产一个目标文件(.o格式),而最终的可执行文件只有一个。连接器会把所有目标文件合并成一个可执行文件。 目标文件由若干段组成,如代码段,数据段,未初始话数据段等。链接时,链接器会打破目标文件的内部结构,把所有目标文件代码段都提取 出来,共同组成最终可执行程序的代码段,并把代码段放在指定的地址空间内。 链接文件的作用是:描述如果把目标文件中的段映射到可执行文件中去,并控制可执行文件中的内存布

qq_35056682的博客 3087

Linker Script 链接器脚本(2)

5 为符号指定值在脚本中,可以为一个符号symbol指定一个值。这样会把符号定义为全局符号symbol。5.1 Simple Assignments5.2 PROVIDE5.1 简单赋值使用任何的C赋值操作来给一个符号赋值。像下面这样:symbol = expression ; symbol += expression ; symbol -= expression ; symbol *= expr

firststp的专栏 2524

Gnu linker script 脚本手册-笔记

一.概述 链接过程由链接脚本(lds文件)控制,链接脚本主要用于规定输出文件的内存布局。(可以看做链接过程中的Makefile) 链接器的默认链接脚本,可以通过 ld --verbose 来进行查看,可以通过 -T 选项用于指定自己的链接脚本。 二.简单例子 SECTIONS { . = 0x10000; .text : { *(.text) } . = 0x800000; .data : { *(.data) } .bss : { *(.bss) } } . = 0x10000 :

dream0130__的博客 742

GNU linker script,ld script,GNU链接脚本

版权声明:本文转自 https://blog.csdn.net/itxiebo/article/details/50937412 注,此文部分内容摘抄自网络,博主(itxiebo)主要的贡献是整理编辑等。 一、什么是GNU linker script?作用是什么? .lds文件,即linker script,决定了可执行映像(image)的链接方式,以及各个段的装载地址(装载域...

weixin_44329939的博客 368

【第35期】Memory Map详解:Linker Script(链接脚本)

嵌入式开发中的内存管理核心在于理解链接脚本(.ld文件)如何分配四大关键内存段:.text(代码段)和.rodata(只读数据)存储在Flash;.data(初始化变量)在Flash存储初始值,运行时复制到RAM;.bss(零值变量)仅占用RAM空间。链接脚本通过定义LMA(加载地址)和VMA(运行地址)实现数据搬运,启动代码负责将.data段从Flash复制到RAM。堆栈位于RAM末端,而关键代码可通过特殊段属性加载到RAM提升执行速度。掌握这些内存分配原理是解决程序跑飞、OTA升级等问题的关键。

一路往蓝-Anbo 的博客 934

Linker script 链接器脚本

作者:firststp    出处:http://blog.csdn.net/firststp/每个链接都由链接脚本控制着,脚本由链接器命令语言组成。脚本的主要目的是描述如何把输入文件中的节(sections)映射到输出文件中,并控制输出文件的存储布局。大多数的链接脚本就是做这些事情的,但在有必要时,脚本也可以指导链接器执行一些其他的操作。链接器总是使用链接器脚本,如果你没有提供一个你

四度空间 1719

连接脚本介绍 Linker Script

为了得到一个可以工作的二进制文件,在代码开发过程中需要使用一系列工具。编译简单的应用程序需要几个工具: 它们是编译器、汇编器、链接器和二进制生成器。它们中的每一个都在链式过程中完成自己的任务。连接器将不同的object文件连接成为一个统一的object文件(一般情况下是elf格式, 也可称为可执行文件)链接器脚本是一个文件,它定义了微控制器特定的特性,如内存映射、内存段、堆栈位置和大小。如果需要,它还可能包含特定于应用程序的信息。MEMORY {每种内存类型也被划分为存储不同类型数据的section。

2301_76563067的博客 1004
上一篇: 内核开发中的竞争及其解决
下一篇: Linker Script 链接器脚本(2)
firststp
博客等级 码龄24年 4粉丝 11原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值