文档库 最新最全的文档下载
当前位置:文档库 › 如何读取 ELF Section

如何读取 ELF Section

如何读取 ELF Section
如何读取 ELF Section

如何讀取ELF Section

我們分2 個步驟來讀取ELF 的section 資訊:

1. 如圖一,一開始先讀取section header table 的資訊。section header table 是所有section 的紀錄表格,所有的section 都要透過section header table 才能得知其在檔案中的偏移位置(offset),如此一來才能讀取section 的內容。

2. 如圖二,接著再根據section header table 讀取檔案裡的每一個section。

section header table 裡的section 個數(section entries)紀錄於ELF header 裡的e_shnum欄位,每個section entry 的長度則是紀錄在ELF header 的e_shentsize欄位,單位是bytes。

圖一:Section Header Table

ELF header 裡的e_shoff欄位,是section header table 開始的檔案偏移位置(file offset)。因此,我們只要由e_shoff偏移值開始讀取e_shnum個單位,每個單位為e_shentsize (bytes),即可將整個section header table 讀取出來。

圖二:Section Entries

SysV ABI 定義section entry 的資料結構如下:

typedef struct {

Elf32_Word sh_name;

Elf32_Word sh_type;

Elf32_Word sh_flags;

Elf32_Addr sh_addr;

Elf32_Off sh_offset;

Elf32_Word sh_size;

Elf32_Word sh_link;

Elf32_Word sh_info;

Elf32_Word sh_addralign;

Elf32_Word sh_entsize;

} Elf32_Shdr;

Section header table 是Elf32_Shdr data type 的陣列,其元素個數為e_shnum,我們可以透

過索引Elf32_Shdr陣列來讀取所有的section,如圖二所示。

Section header(Elf32_Shdr)的欄位用途說明如下表。

Field Description

sh_name section的名稱,需由string table查表取得。

sh_type section的類型。

sh_flags section的屬性。

sh_addr section在記憶體裡的起始位址,但並非所有的section都會被載入至記sh_offset section在objct file裡的開始偏移值(offset),程式必須根據此欄位來讀sh_size section的長度(bytes)。

sh_link 可用來存放section header table的index link。

sh_info 可用來存放section的額外資訊。

sh_addralign 紀錄section的address alignment,例如有些section的alignment為DW

sh_entsize

有些section的內容為entry長度固定的table,例如symbol table。此欄用單位是bytes。

範例程式:loader v0.3

接著說明loader v0.2 需要改寫的功能。

在主程式新增一個parse_sections()函數來讀取ELF object file 的section header table:parse_sections(&f_header, fd);

parse_sections()負責做2件工作:

1. 讀取Section Header Table

2. 找出Section Name String Table

同時,在主程式也要加入以下 2 個變數:

Elf32_Shdr header[40];

Elf32_Shdr *strtab; /* point to string table */

header[]用來存放由section header table 所讀取出來的所有section entry,其型別為Elf32_Shdr;strtab指標用來指向section name string table,其型別為Elf32_Shdr。Section name string table 是一個特殊的section,下一個範例再來處理這個section。

將檔案讀寫指標移到e_shoff的地方,準備開始讀取section header table:

lseek(fd, hdr->e_shoff, SEEK_SET);

然後再利用最簡單的方式,一次一個將所有的section entry讀取出來,並且判斷該section entry是否為string table:

for (i = 0; i < hdr->e_shnum; i++) {

read(fd, &header[i], sizeof(Elf32_Shdr));

/* find out string table ! */

if (header[i].sh_type == SHT_STRTAB) strtab = &header[i];

}

最後,section 用途是根據他的類型來區分的,這個部份留待下次再做說明。

範例列表:loader v0.3

/*

* Copyright(c) 2003,2006 https://www.wendangku.net/doc/1e11587264.html,

*

* ELF programming. ver 0.3

*

*/

#include

#include

#include

#include

#include

#include

int elf_ident(char *ident)

{

if (*(ident+EI_MAG0) != ELFMAG0) return 0;

if (*(ident+EI_MAG1) != ELFMAG1) return 0;

if (*(ident+EI_MAG2) != ELFMAG2) return 0;

if (*(ident+EI_MAG3) != ELFMAG3) return 0;

return -1;

}

void parse_ident(char *ident)

{

printf("ELF Identification\n");

printf(" Class: ");

switch (*(ident+EI_CLASS)) {

case ELFCLASSNONE: printf("Invalid class\n"); break;

case ELFCLASS32: printf("32-bit objects\n"); break;

case ELFCLASS64: printf("64-bit objects\n"); break;

}

}

void parse_machine(Elf32_Half machine)

{

printf("Machine: ");

switch (machine) {

case EM_NONE: printf("No machine\n"); break;

case EM_M32: printf("AT&T WE 32100\n"); break;

case EM_SPARC: printf("SPARC\n"); break;

case EM_386: printf("Intel 80386\n"); break;

case EM_68K: printf("Motorola 68000\n"); break;

case EM_88K: printf("Motorola 88000\n"); break;

case EM_860: printf("Intel 80860\n"); break;

case EM_MIPS: printf("MIPS RS3000 Big-Endian\n"); break;

default: printf("Unknow\n");

}

}

void parse_sections(Elf32_Ehdr *hdr, int fd)

{

int i;

Elf32_Shdr header[40];

Elf32_Shdr *strtab; /* point to string table */

printf("Num of secionts: %d\n", hdr->e_shnum);

/* file offset of section header table */

lseek(fd, hdr->e_shoff, SEEK_SET);

for (i = 0; i < hdr->e_shnum; i++) {

read(fd, &header[i], sizeof(Elf32_Shdr));

/* find out string table ! */

if (header[i].sh_type == SHT_STRTAB) strtab = &header[i];

}

}

int main(int argc, char *argv[])

{

int fd;

Elf32_Ehdr f_header;

if (argc != 2) {

printf("Usage: loader [filename]\n");

return -1;

}

fd = open(argv[1], S_IRUSR);

if (fd < 0) {

printf("\nfile open error\n");

return -1;

}

/* Read ELF Header */

read(fd, &f_header, sizeof(Elf32_Ehdr));

/* Parse header information */

if (elf_ident(f_header.e_ident)) {

parse_ident(f_header.e_ident);

parse_machine(f_header.e_machine);

parse_sections(&f_header, fd);

} else {

printf("not a ELF binary file\n");

}

close(fd);

}

執行結果

$ ./loader-0.3 ./loader-0.3

ELF Identification

Class: 32-bit objects

Machine: Intel 80386

Num of secionts: 34

根據SysV ABI 的定義,若section 的類型為SHT_STRTAB,則該section entry 即為string table 的section header。Section 的類型可由section header 的sh_type欄位來判斷,SysV ABI 定義的section 類型(sh_type)如下表所示。

表sh_type欄位的定義

Name Value

SHT_NULL 0

SHT_PROGBITS 1

SHT_SYMTAB 2

SHT_STRTAB 3

SHT_RELA 4

SHT_HASH 5

SHT_DYNAMIC 6

SHT_NOTE 7

SHT_NOBITS 8

SHT_REL 9

SHT_SHLIB 10

SHT_DYNSYM 11

SHT_LOPROC 0x70000000

SHT_HIPROC 0x7fffffff

SHT_LOUSER 0x80000000

SHT_HIUSER 0xffffffff

我們在範例程式loader-0.3.c中,試著由一堆的section 裡找出類型為string table (SHT_STRTAB)的section。接下來程式loader-0.4.c將會試著實作讀取ELF 的string table,並將有section 的名稱印出。

讀取Section Name String Table

String table 是一個特殊的section,此section 紀錄所有section 的名稱(ASCII 字串)。String table 是一個字元型別的陣列,每一個section 都會有一個索引值來索引自己的section name 字串,section header的sh_name欄位則是存放了此索引值,如圖所示。

圖ELF section name string table

接下來的範例程式將不再直接列表,請大家由https://www.wendangku.net/doc/1e11587264.html,/elf-programming下載。

程式說明

呼叫了parse_sections()函數來讀取section header table:

parse_sections(&f_header, fd);

相較於loader-0.3.c的parse_sections()函數,在0.4 的版本裡,我們所做的改變如下:

1. 讀取string table 的內容

2. 列印所有section 的名稱

首先,我們新增一個陣列來存放string table 的內容:

char strtab[65535];

接下來一樣讀取所有的section entry,並且找出string table:

for (i = 0; i < hdr->e_shnum; i++) {

read(fd, &header_ent[i], sizeof(Elf32_Shdr));

/* load section name string table */

if (i == hdr->e_shstrndx) {

sh_strtab = &header_ent[i];

}

}

我們試著用另外一種方法來找出string table 吧!根據SysV ABI 的定義,string table 在section header table 裡的section entry index(索引值)紀錄在ELF header 的e_shstrndx欄位,因此,我們判斷目前的section header table 索引值是否等於e_shstrndx來找出string table。接下來再讀取string table的內容:

/* read “String Table” */

lseek(fd, sh_strtab->sh_offset, SEEK_SET);

read(fd, strtab, sh_strtab->sh_size);

程式裡利用lseek()函數將檔案讀寫指標移string table 開始的地方,然後再將整個string

table 讀出。要注意的是,section 的長度紀錄於section header裡的sh_size欄位。最後再逐一將每個section的名稱列印在螢幕上:

/* Index 0: undefined */

for (i = 1; i < hdr->e_shnum; i++) {

printf("%s\n", &strtab[header_ent[i].sh_name]);

}

小結

我們知道一個很重要的觀念了。ELF section 的字串名稱是由string table 查表得知,section 名稱在string table 陣列裡的索引值則是紀錄在section header 裡的sh_name欄位。

(完整word)(整理)KingSCADA初级教程第五章动画连接与脚本程序.

第五章动画连接与脚本程序 本章内容 基本动画连接 系统脚本 自定义脚本 概述 为了使设计的画面与现场设备情况同步动起来,就要进行动画连接。动画连接主要实现监视与控制功能。 所谓动画连接就是建立画面的图素与数据库变量的对应关系,使得变量数值的改变会反应到图形对象的外观的变化,这就是监视;将用户的动作与系统的行为联系起来,以便改变某些监控变量的值或执行一段动作,这就是控制。 第一节基本动画连接 前面一章我们在讲精灵图和图形模型的制作时已经用到了动画连接了,不同的图素动画连接也不一样。下面我们就有选择的介绍几种动画连接,在这里没有介绍到的动画连接请大家课后参考操作手册自己练习使用。 水泵以及阀门的状态指示: 本培训工程中有三个水泵,我们以水泵1为例,在水泵上制作一个指示灯来动态显示水泵的启停状态。 我们在水泵上面画一个圆作为指示灯的图素,设置画刷属性,属性设置完成后我们设置动画连接,选择右侧连接,点击,如图5-1所示,选择“属性-画刷” 图5-1 动画连接

弹出如图5-2所示动画连接画面,选择变量类型为离散类型变量。 图5-2 动画连接设置 点击选择变量\\local\valve_gate1。然后进行配置,条件为“true”时,选择颜色为绿色,为“false”时,选择颜色为红色。如图5-3所示。配置完成后点击“确定”完成水泵状态的颜色指示设置。 同样的方式我们可以设置其他的水泵以及阀门的状态指示。注意关联的变量不要错了。 图5-3 动画连接设置

液位的报警指示: 我们做一个原料罐与催化剂罐的液位的报警指示灯。我们利用闪烁与隐含的动画连接来实现。 首先画一个圆作为报警灯的图素,然后选择右侧的连接,点击,选择“闪烁—画刷闪烁”,弹出动画连接配置画面,点击选择变量,如图5-4,选择变量\\local\valve_gate1,然后点击变量域,选择变量的报警域Alarm,选择完成后点击OK,这样动画连接关联的变量为\\local\valve_gate1.Alarm,然后配置闪烁的速度,闪烁时画刷的颜色改变,配置完成后动画连接如图5-5所示: 图5-4 选择变量域 图5-5 画刷闪烁动画连接

链接脚本文件语法详解

我们对每个c或者汇编文件进行单独编译,但是不去连接,生成很多.o 的文件,这些.o文件首先是分散的,我们首先要考虑的如何组合起来;其次,这些.o文件存在相互调用的关系;再者,我们最后生成的bin文件是要在硬件中运行的,每一部分放在什么地址都要有仔细的说明。我觉得在写makefile的时候,最为重要的就是ld的理解,下面说说我的经验: 首先,要确定我们的程序用没有用到标准的c库,或者一些系统的库文件,这些一般是在操作系统之上开发要注意的问题,这里并不多说,熟悉在Linux编程的人,基本上都会用ld命令;这里,我们从头开始,直接进行汇编语言的连接。 我们写一个汇编程序,控制GPIO,从而控制外接的LED,代码如下; .text .global _start _start: LDR R0,=0x56000010 @GPBCON寄存器 MOV R1,# 0x00000400 str R1,[R0] LDR R0,=0x56000014 MOV R1,#0x00000000 STR R1,[R0] MAIN_LOOP: B MAIN_LOOP 代码很简单,就是一个对io口进行设置然后写数据。我们看它是如何编译的,注意我们这里使用的不是arm-linux-gcc而是arm-elf-gcc,二者之间没有什么比较大的区别,arm-linux-gcc 可能包含更多的库文件,在命令行的编译上面是没有区别。我们来看是如何编译的: arm-elf-gcc -g -c -o led_On.o led_On.s 首先纯编译不连接 arm-elf-ld -Ttext 0x00000000 -g led_On.o -o led_on_elf 用Ttext指明我们程序存储的地方,这里生成的是elf文件,还不是我们真正的bin,但是可以借助一些工具可以进行调试。然后: arm-elf-objcopy -O binary -S led_on_elf led_on.bin 生成bin文件。

连接脚本相关

连接脚本相关知识 一个程序本质上都是由bss段、data段、text段三个组成的。这样的概念,不知道最初来源于哪里的规定,但在当前的计算机程序设计中是很重要的一个基本概念。而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题。 BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。用于存放没有被初始化的或者初始化为0的全局变量和静态变量。 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。用于存放已经初始化过的(且初始化值不为0)的全局变量和静态变量。 代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。 堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减) 栈(stack):栈又称堆栈,是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。SECTIONS //该链接脚本,就是用来对bss段、data段、text段进行有效的排版的!! { . = 0x00000000; .text : {*(.text)} //冒号:两边一定要有空格!!!!!!! . = 0x32000000; .data : {*(.data)} __bss_start = .; .bss : { *(.bss) } _end = .; } 注意:1.若为nor flash启动,为什么. = 0x32000000不能够改成. = 0x1000呢?那是因为nor flash的只读不写的特性决定了的,当程序再次初始化bss中的全局变量的时候,是不可能完成的!!!!! 2.一般bss段是紧跟在data段后面的!!!! 问:怎么理解一个连接地址? 答:以一个没有被初始化的变量i为例子(在编译的时候,它会被归为BSS段的): a.当连接地址指定为0x00000000时,那么编译的时候,编译器给i分配的地址可能是0x00000000后一小段的的某个地址(查看反汇编可以得知); b.当连接地址指定为0x30000000时,那么编译的时候,编译器给i分配的地址可能是0x30000000后一小段的的某个地址(查看反汇编可以得知); c.所以,可以感悟出,如果我们的连接地址是0x300000000,而我们在没有重定位之前,想去访问这个i变量,那绝对会失败的。 总结: 1.程序运行时,“应该”位于它的连接地址; 2.但是由于硬件的特性决定,程序最开始执行时,是从0x0地址开始的,所以,再最开始的几段代码里面,需要实现重定位,这几段代码实现把程序拷贝到连接地址去,然后执行,如果不拷贝到连接地址去,那么将得不到理想的上述的i变量; 3.既然程序应该从连接地址开始运行,那么为什么,上述的最前面的代码却可以运行呢?因为最前面的代码都是

Dreamweaver内部、外部与脚本链接

Dreamweaver内部、外部与脚本链接 今天小编为大家介绍一下网页中的内部链接、外部链接与脚本链接。 外部链接,又常被称为:“反向链接”或“导入链接”,是指其他网站链接到你的网站的链接。 外部链接指的是针对搜索引擎,与其它站点所做的友情链接。高质量的外部链接指:和你的网站建立链接的网站知名度高,访问量大,同时相对的外部链 作用 外部链接主要有两个作用。一个作用是面向用户,用户可以通过A网站的链接点击到B网站从而带来访问者,另一个作用是外部链接可以分享到一部分权重,A网站链接到B网站代表A网站告诉搜索引擎它信任B网站,觉得B网站是一个不错的网站从而给B网站投了一票,这样B网站就可以从A网站分享到一定权重,并在搜索引擎那的权重得到提高。 接较少,有助于快速提升你的网站知名度和排名的其他网站的友情链接。 内部链接 与外部链接(即反向链接)相反,内部链接是指同一网站域名下的内容页面之间互相链接。如频道、栏目、终极内容页之间的链接,乃至站内关键词之间的Tag链接都可以归类为内部链接,因此内部链接我们也可以称之为站内链接,对内部链接的优化其实就是对网站的站内链接的优化。 内部链接的作用

我们都知道外部链接可以提高网站权重,进而促使排名靠前,那么内部链接又有什么作用呢?反向链接的重要性,很多SEO项目其实到了后期就是外部链接的交换与维护,由此也可见外部链接对网站排名的重要性。但是很多SEO将外部链接当成网站优化的全部,这其实是非常错误的,因为合理地安排内部链接,尤其是大型网站,合理的内部链接部署策略同样可以极大地提升网站的SEO效果。作为SEO,我们不应该忽略站内链接所起的巨大作用。 内部链接的优点 内部链接容易控制,成本低。你直接就可以在自己的站上进行部署,不像外部链接的不可控性比较大,需要大量的购买或长期的积累才有办法实现稳定的SEO效果。 脚本链接 执行 JavaScript 代码或调用 JavaScript 函数。它非常有用,能够在不离开当前 Web 页面的情况下为访问者提供有关某项的附加信息。脚本链接还可用于在访问者单击特定项时,执行计算、验证表单和完成其它处理任务。

loadrunner连接DB2数据库测试脚本

/* * 项目名称:无 * 脚本功能:对数据库进行查询操作 * 版本号:V1.0 * 编码语言:JAVA * 开发协议: * 作者: * 时间:20160819 * 注意事项:运行脚本时,需要提前把数据库jdbc驱动导入,jdk中bin目录导入;*/ import lrapi.lr; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Actions { private Connection conn=null; private Statement stmt=null; private ResultSet rs=null; private String server="";//数据库地址 private String dataBase="";//数据库名 private String username="";//用户名 private String password="";//密码 //需要修改数据库IP和PORT private String url="jdbc:db2://ip:port/BBSPDB"; public int init() throws Throwable

{ //连接mysql数据库使用下面的方法 //Class.forName("com.mysql.jdbc.Driver").newInstance(); //conn=DriverManager.getConnection("jdbc:mysql://"+server+"/dkhs?user="+username+"& password="+passworkd); //连接DB2数据库使用下面的方法 Class.forName("com.ibm.db2.jdbc.Driver").newInstance(); conn=DriverManager.getConnection(url,username,password); stmt=conn.createStatement(); return 0; } public int action() throws Throwable { rs=stmt.executeQuery("select * from accounts_user"); while(rs.next()) { lr.error_message(rs.getString("username")); //打印出查询的结果 } return 0; } public int end() throws Throwable { stmt.close(); conn.close(); return 0;

ld -Ttext 与连接脚本

ld -Ttext 与连接脚本 arm-linux-ld命令 -T选项是ld命令中比较重要的一个选项,可以用它直接指明代码的代码段、数据段、博士生、 段,对于复杂的连接,可以专门写一个脚本来告诉编译器如何连接。 -Ttext addr -Tdata addr -Tbss addr arm-elf-ld -Ttext 0x00000000 -g led_On.o -o led_on_elf ,运行地址为0x00000000,由于没有data和bss,他们会默认的依次放在后面。相同的代码不同的Ttext,你可以对比一下他们之间会变的差异,ld 会自动调整跳转的地址。 *简单的Linker script (1) SECTIONS命令: The SECTIONS command tells the linker how to map input sections into output sections, and how to place the output sections in memory. 命令格式如下: SECTIONS { sections-command sections-command ...... } 其中sections-command可以是ENTRY命令,符号赋值,输出段描述,也可以是overlay描述。 (2) 地址计数器?.‘(location counter): 该符号只能用于SECTIONS命令内部,初始值为?0‘,可以对该符号进行赋值,也可以使用该符号进行计算

或赋值给其他符号。它会自动根据SECTIONS命令内部所描述的输出段的大小来计算当前的地址。(3) 输出段描述(output section description): 前面提到在SECTIONS命令中可以作输出段描述,描述的格式如下: section [address] [(type)] : [AT(lma)] { output-section-command output-section-command ... } [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp] 很多附加选项是用不到的。其中的output-section-command又可以是符号赋值,输入段描述,要直接包含的数据值,或者某一特定的输出段关键字。 *linker script 实例 ============================== OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS { . = 0xa3f00000; __boot_start = .; .start ALIGN(4) : { *(.text.start) } .setup ALIGN(4) : {

关于PIC的C18编译器的链接脚本文件

关于PIC的C18编译器的链接脚本文件 在PIC单片机编程中,链接描述文件(*.lkr)是链接器的命令文件。它们指定以下内容: * 目标部件的程序和数据存储器区域 * 堆栈大小和位置(对于MPLAB C18) * 源代码中的逻辑代码段与程序和数据区域的映射 MPLAB C18 C 编译器为每种单片机提供了多达四种类型的链接器描述文件(*.lkr)。这些链接器描述文件与MPLAB IDE所提供链接器描述文件的 不同之处在于,它们在编译器启动代码和库中自动链接,并留出堆栈区。为PIC18F4620单片机提供的四个链接器描述文件如下所示: 18f4620.lkr 供在非扩展模式下编译的应用程序使用。 18f4620i.lkr 供在非扩展模式下编译并使用MPLAB ICD 2 调试的应用程序使用。“i”表示此链接器描述文件为MPLAB ICD 2使用的资源分配存储空间。 18f4620_e.lkr 供在扩展模式编译的应用程序使用。 18f4620i_e.lkr 供在扩展模式下编译并使用MPLAB ICD 2 调试的应用程序使用。“i”表示此链接器描述文件为MPLAB ICD 2使用的资源分配存储空间。 对于18f4620i_e.lkr 必须添加到MPLAB IDE项目的项目文件中。 所需要的启动模块、标准函数库和处理器函数库在链接器描述文件中指定,所以在mplab的项目树的“Object Files”或“Library Files”中都不需要添加任何文件。当然,如果项目中要链接其它目标文件或库文件,那么应将它们添加到这些分支下。 下面我们结合18f4620.lkr来说明链接描述文件中代码的含义 // $Id: 18f4620.lkr,v 1.3 2004/04/26 18:09:00 curtiss Exp $ // File: 18f4620.lkr // Sample linker script for the PIC18F4620 processor //将当前目录library/object搜索路径,.代表当前目录 LIBPATH . //FILES伪指令指定链接的目标或库文件 //注:可以在一个单独的FILES 伪指令中指定多个目标或库文件。 FILES c018i.o FILES clib.lib FILES p18f4620.lib //链接描述文件说明PICmicro MCU的存储器架构。这使链接器可把代码在可用的ROM 空间,把变量放在可用的RAM 空间。标记PROTECTED的区域不会被用于一般程序或数据的分配。只有在为代码段指定了一个绝对地址时,或在链接描述文件中使用SECTION 伪指令将该代码段分配给该区域时,代码或数据才被分配到这些区域。 //CODEPAGE 伪指令用于程序代码、初始化的数据值、常数值和外部存储器。 CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED //复位向量和中断 向量 CODEPAGE NAME=page START=0x2A END=0xFFFF //用户存储空间 CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED //ID 地址单元

脚本大全

- Go to 跳转到指定的帧 - Play 播放 - Stop 停止 - Toggle High Quality 在高画质和低画质间切换 - Stop All Sounds 停止所有声音的播放 - Get URL 跳转至某个超联结 - FSCommand 发送FSCommand命令 - Load Movie 装载影片 - Unload Movie 卸载影片 - Tell Target 告知目标 - If Frame. Is Loaded ..判断帧是否被完全载入 - On Mouse Event 鼠标事件 。其他Actions。包括: - break 跳出循环 - call 调用指定帧(一般喊有某个特定函数) - comment 注释 - continue 继续循环 - delete 删除一个对象(Object)中的变量 - do while do while循环 - duplicateMovieClip 复制MC - else 否则(与if联用) - else if 否则如果(与if联用) - evaluate 调用自定义函数(Function) - for for循环 - for .. in 依次取得对象(Object)中的各个属性或者某个数组中的所有元素 - FSCommand 发送FSCommand命令 - function 声明自定义函数 - getURL 跳转至某个超联结 - goto 跳转到指定的帧 - if 如果 - ifFrameLoaded ..帧是否完全被载入 - include 读入外部的ActionScript程序文件(.as) - loadMovie 装载MC - loadVariables 转载外部文件中的数据,这些外部文件可以是文本文件,或者是由ASP/CGI等脚本返回的文本值 - on 鼠标事件的触发条件 - onClipEvent MC的事件触发程序 - play 播放 - print 输出到打印机 - removeMovieClip 删除MC - return 在函数(function)中返回一个值 - set variable 设定变量值

GCC-LD 连接脚本分析--uboot.ld

GCC-LD 连接脚本分析--uboot.ld GCC-LD 连接脚本分析--uboot.lds (2011-03-18 09:48) 一键转载 标签: 转载 原文地址:GCC-LD 连接脚本分析--uboot.lds 作者:Embedded_Li1 Command Language The command language provides explicit control over the link process allowing complete specification of the mapping between the linker s input files and its output. It controls: input files file formats output file layout addresses of sections placement of common blocks 1.1 input section and output section

所谓的输出段,是指生成的文件,例如elf 中的每个段 所谓的输入段,是指连接的时候提供LD的所有目标文件(OBJ)中的段 1.2 ima and vma lma = load memory address vma = vitual memory address 1.3 relate with system and entry point OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm) ENTRY(_start) 1.4 输出段的标准格式 section [address] [(type)] : [AT(lma)] { output-section-command output-section-command ... } [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp] 前面也说了,所谓的输出段是指最终生成的文件里面的段,所以一个输出段就可以理解为 最终文件里面的一个块,那么多个块合起来就是一个完成文

连接脚本的学习

连接脚本的学习 1. 概论 每一个链接过程都由链接脚本(linker script, 一般以lds作为文件的后缀名)控制. 链接脚本主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局. 但你也可以用连接命令做一些其他事情. 连接器有个默认的内置连接脚本, 可用ld --verbose查看. 连接选项-r和-N可以影响默认的连接脚本(如何影响?). -T选项用以指定自己的链接脚本, 它将代替默认的连接脚本。你也可以使用<暗含的连接脚本>以增加自定义的链接命令. 以下没有特殊说明,连接器指的是静态连接器. 2. 基本概念 链接器把一个或多个输入文件合成一个输出文件. 输入文件: 目标文件或链接脚本文件. 输出文件: 目标文件或可执行文件. 目标文件(包括可执行文件)具有固定的格式, 在UNIX或GNU/Linux平台下, 一般为ELF格式. 若想了解更多, 可参考UNIX/Linux平台可执行文件格式分析 有时把输入文件内的section称为输入section(input section), 把输出文件内的section称为输出section(output sectin). 目标文件的每个section至少包含两个信息: 名字和大小. 大部分section还包含与它相关联的一块数据, 称为section contents(section内容). 一个section可被标记为“loadable(可加载的)”或“allocatable(可分配的)”. loadable section: 在输出文件运行时, 相应的section内容将被载入进程地址空间中. allocatable section: 内容为空的section可被标记为“可分配的”. 在输出文件运行时, 在进程地址空间中空出大小同section指定大小的部分. 某些情况下, 这块内存必须被置零. 如果一个section不是“可加载的”或“可分配的”, 那么该section通常包含了调试信息. 可用objdump -h命令查看相关信息. 每个“可加载的”或“可分配的”输出section通常包含两个地址: VMA(virtual memory address 虚拟内存地址或程序地址空间地址)和LMA(load memory address加载内存地址或进程地址空间地址). 通常VMA和LMA是相同的. 在目标文件中, loadable或allocatable的输出section有两种地址: VMA(virtual Memory

脚本的写法

脚本的写法 标准格式为: 序号景别镜头运动画面台词音乐或音响 电视广告文案的表现特殊性 (一)特殊的形式 电视广告文案是广告文案在电视广告中的特殊形式。由于电视广告文案在写作过程中除了运用一般的语言文字符号外,还必须掌握影视语言,运用蒙太奇思维,按镜头顺序进行构思,这颇似电影文学剧本的写作,因而又被称为电视广告脚本。 电视广告的各种构成要素:素材、主题、艺术形式、表现手段以及解说词等,都是广告创意的重要组成部分,这一切都必须首先通过电视广告脚本的写作体现出来,从而使电视广告文案显示出有别于其他广告文案的特殊性。

(二)特殊的性质 电视广告脚本是电视广告创意的文字表达,是体现广告主题,塑造广告形象,传播广告信息内容的语言文字说明,是广告创意的具体体现,因而,它是现代广告文案写作的重要组成部分。 然而,它又与报刊等平面广告文案的性质有明显的区别:它并不直接与受众见面,因为它不是广告作品的最后形式。只不过是为导演进行再创作提供的详细计划、文字说明或蓝图,是电视广告作品形成的基础和前提。因此,对未来广告作品的质量和传播效果具有举足轻重的作用。 电视广告脚本包括既相连接,又各自独立的两种类型:一是文学脚本,二是分镜头脚本。文学脚本是分镜头脚本的基础;分镜头脚本是对文学脚本的分切与再创作。前者由文案撰写者(编剧)撰写,后者由导演完成。 (三)特殊的语言--影视语言 影视语言不仅是电视广告的信息传达手段,也是电视广告形象得以形成、体现的必不可少的先决条件,因而它是电视广告的基础和生命。

1.影视语言的特点 (1)具象性、直观性。它总是以具体形象来传情达意,传递信息。(2)运动性、现实性。摄影机具有客观地记录现实的作用和"物质现实的复原"功能,因而影视画面的基本特征是"活动照相性",可以使观众产生一种身临其境的现实感。 (3)民族性、世界性。影视语言不仅具有鲜明的民族性特征,而且是一门世界性语言,可以成为各国人民交流思想,传递信息,沟通感情的工具。 2.影视语言的构成 主要由以下三部分要素构成: 一是视觉部分,包括屏幕画面和字幕; 二是听觉部分,包括有声语言、音乐和音响; 三是文法句法--蒙太奇(镜头剪辑技巧)。

自动配置脚本文件的写法与用途

自动配置脚本文件的写法与用途(原创) http://deepspace.xmublog.Org/2006/10/proxypac.html 因为女朋友在深圳大学,他们学校的网络比较变态。如果访问了教育网指定的免费ip 之外的ip,每m 6元钱。 我本来想教她用二级代理之类的,不过无奈这个对她来讲太难了。所以权宜之下,我只好让她使用ie的自动配置脚本文件来限制以防万一,至少能保证她在使用浏览器上网的时候不会因为不小心访问了收费的ip而挨宰。 虽然说这么变态的学校不多,但是终究还是有的,所以把自动配置脚本文件的写法写出来,如果有需要的朋友可以参考着来。 首先我们先来介绍一下自动配置脚本文件: 打开ie,点击"工具"--"internet选项"--"局域网设置",你就可以看到"使用自动配置脚本" 自动配置脚本起的作用就是,当ie访问网页的时候会根据脚本文件里面界定的内容来访问。比方说,你在脚本文件里面限定了访问某些ip使用某个代理的时候,访问另外一些ip使用另外的代理,这就很方便通过脚本文件来完成。 一个pac文件其实就是一个文本文件,最简单的格式就是包含一个叫findproxyfOrurl 的jscript函数,ie通过传入两个变量来调用这个函数,一个是用户浏览的地址url全路经,一个是这个url中的主机名部分(host)。 这个findproxyfOrurl函数有三种可能的字符串返回值,一是"direct",就是直接连接,不通过代理;二是"proxy proxyaddr:pOrt",其中proxyaddr和pOrt分别是代理的地址和代理的端口;三是"socks socksaddr:pOrt",其中socksaddr和pOrt分别是socks代理的地址和端口,一个自动代理文件可以是多个选择的组合,其中用分号(;)隔开,如: function findproxyfOrurl(url,host) { if (host == "https://www.wendangku.net/doc/1e11587264.html,") return "direct"; return "proxy myproxy:80; proxy myotherproxy:8080;

CRT使用方法及脚本配置注意事项

1、请用USB转接线,一端连接电脑,一端连接console线。Console线连接设备上的console 口(设备上有标注)。注意:USB转接线连接电脑时需要安装驱动,若无驱动光盘,可在转接线连接电脑时,联网使用鲁大师检测驱动,检测无驱动后安装驱动即可。 2、使用软件来进行配置。待转接线驱动安装成功之后,转接线连接console线,从而连接到设备。先右键点击“我的电脑”—“属性”—“设备管理器”, 打开设备管理器之后,查看COM口的数字是多少,如下图所示: 记住COM口的数字。然后打开CRT软件,弹出设置窗口,请按照下图所示的参数进行设置;

其中COM3就是刚刚在设备管理器内查看的COM口的数字号,波特率选择9600,协议选择Serial,其它的参照上图设置。 设置完成之后点击连接,之后出现绿色的对号即表示连接成功,此时按回车键即会出现类似ruijie>的字样,这时就可以进行配置了。 3、脚本我已经准备好了,有些细节需要您注意:

●如图模板中标红的地方表示一次性 配置1-12口和13-24口,其中VLAN 10表示门禁,VLAN 20表示监控,这是根据您的实际需求来配置的。假如您需要配置1-10口是监控,11-24口是门禁,那么配置就是如下: ,因此配置是根据您实际需求可以在模板上自行修改。 ●单个接口配置的时候就把上图中的range给删除即可。如: ●另外,设备的管理地址也需要您在设备导入模板之前修改的,否则设备的管理地址就会 一样导致网络内地址冲突。如下图示: 因管理VLAN是254,网段是192.168.254.0/24网段,所以,您需要每台设备修改的地址就

相关文档
相关文档 最新文档