`
dato0123
  • 浏览: 924868 次
文章分类
社区版块
存档分类
最新评论

重定位编译文件

 
阅读更多

//=====================================================================
//TITLE:
// 重定位编译文件
//AUTHOR:
// norains
//DATE:
// Wednesday 29-September-2010
//Environment:
// KEIL MDK 4.0
// .NET Micro Framework
//=====================================================================

如果想将.Net Micro Framework移植到新的硬件平台,免不了要对里面的文件进行一番修改。比如最初的启动文件FirstEntry.s,也许你就要在上面删删减减。那么,遇到这种情况,是不是直接在原文件中修改呢?我想,这应该是最为简单的,也最不容易出错的方法。但如果真的这么做了,那么问题就随之而来了。因为在FirstEntry.s修改的地方,是针对特定平台的,但该文件却是公共的。也就是说,你修改了之后,可能这个文件就不再适合别的Solution了。也许你会说,这没关系,别的Solution我一辈子都不会用到。就假设这说法成立吧,但如果你要将辛勤劳动的成功和别人分享,那你是不是也要求对方将这公共文件也更改呢?万一对方要使用多个Solution呢?所以,我们不应该直接在原文件上进行修正,而要另辟蹊径。

以重定位FirstEntry.s文件为例子。包含该文件的工程位于./DeviceCode/cores/dotNetMF.proj,而这个工程恰好又被NativeSample.proj所依赖。因为移植都是从NativeSample入手,所以我们就在这个文件上进行捣鼓。

首先,将原来的./DeviceCode/cores/dotNetMF.proj文件拷贝到./[SOLUTION]/DeviceCode/CORES/ARM文件夹中。在这里,[SOLUTION]指的是我们目标SOLUTION的路径。

接着,更改NativeSample.proj。之前对于./DeviceCode/cores/dotNetMF.proj的路径依赖是这么写的:

<RequiredProjects Include="$(SPOCLIENT)/DeviceCode/cores/arm/dotNetMF.proj" />

现在我们改为:

<RequiredProjects Include="$(SPOCLIENT)/Solutions/STM32F103ZE_RedCow/DeviceCode/cores/arm/dotNetMF.proj" />

好了,那么现在连接的就是我们的./[SOLUTION]/DeviceCode/CORES/ARM文件了。不过,如果你这时候调用MSBUILD编译的话,肯定会出错。因为原来./DeviceCode/cores/dotNetMF.proj定义的编译文件,都是用相对路径的,现在dotNetMF.proj位置移动了,强制编译肯定要出错。为了修正这个问题,需要将相对路径更改为绝对路径。当然,这绝对路径也不是定死的,因为$(SPOCLIENT)宏定义表示的是.Net Micro Framework的根目录,这对于和朋友分享Solution非常重要。另外一点需要注意的是,除了FirstEntry.s以外,别的都不用重定位,也就还是用原来的文件。

完整的修改后的./DeviceCode/cores/dotNetMF.proj文件如下:

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<AssemblyName>TinyHal</AssemblyName>
<ProjectGuid>{8b626ac4-c8ce-48d9-a7db-0d59f0874983}</ProjectGuid>
<Size>
</Size>
<Description>Core HAL library</Description>
<Level>HAL</Level>
<LibraryFile>TinyHal.$(LIB_EXT)</LibraryFile>
<ProjectPath>$(SPOCLIENT)/Solutions/STM32F103ZE_RedCow/DeviceCode/cores/arm/dotNetMF.proj</ProjectPath>
<ManifestFile>TinyHal.$(LIB_EXT).manifest</ManifestFile>
<Groups>System</Groups>
<LibraryCategory>
<MFComponent xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="TinyHal_HAL" Guid="{37C37BC0-3CA6-4C1C-A26F-4761A7BA3C05}" ProjectPath="" Conditional="" xmlns="">
<VersionDependency xmlns="
http://schemas.microsoft.com/netmf/InventoryFormat.xsd">
<Major>4</Major>
<Minor>0</Minor>
<Revision>0</Revision>
<Build>0</Build>
<Extra />
<Date>2009-04-30</Date>
</VersionDependency>
<ComponentType xmlns="
http://schemas.microsoft.com/netmf/InventoryFormat.xsd">LibraryCategory</ComponentType>
</MFComponent>
</LibraryCategory>
<Documentation>
</Documentation>
<PlatformIndependent>False</PlatformIndependent>
<CustomFilter>
</CustomFilter>
<Required>False</Required>
<IgnoreDefaultLibPath>False</IgnoreDefaultLibPath>
<IsStub>False</IsStub>
<Directory>Solutions/STM32F103ZE_RedCow/DeviceCode/cores/arm</Directory>
<PlatformIndependentBuild>false</PlatformIndependentBuild>
<Version>4.0.0.0</Version>
</PropertyGroup>
<Import Project="$(SPOCLIENT)/tools/targets/Microsoft.SPOT.System.Settings" />
<Import Project="$(SPOCLIENT)/Framework/Features/PreStackInit_HAL.libcatproj" />
<PropertyGroup>
<OutputType Condition="'$(PLATFORM_FAMILY)'=='arm'">Library</OutputType>
</PropertyGroup>

<ItemGroup Condition="'$(INSTRUCTION_SET)'=='arm' or '$(INSTRUCTION_SET)'=='thumb' ">
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/AssemblyCode/arm/$(AS_SUBDIR)/cpwait.s" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/AssemblyCode/arm/$(AS_SUBDIR)/FirstEntry.s" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/AssemblyCode/arm/$(AS_SUBDIR)/IDelayLoop.s" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/AssemblyCode/arm/$(AS_SUBDIR)/Sampling_Profiler_RAM.s" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/AssemblyCode/arm/$(AS_SUBDIR)/VectorsHandlers.s" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/AssemblyCode/arm/$(AS_SUBDIR)/VectorsTrampolines.s" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/Diagnostics/FIQAssembly/$(AS_SUBDIR)/FiqSubhandler_MC9328.s"/>
</ItemGroup>

<ItemGroup Condition="'$(INSTRUCTION_SET)'=='thumb2'">
<Compile Include="$(SPOCLIENT)/Solutions/STM32F103ZE_RedCow/DeviceCode/cores/arm/AssemblyCode/thumb2/$(AS_SUBDIR)/FirstEntry.s" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/AssemblyCode/thumb2/$(AS_SUBDIR)/IDelayLoop.s" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/AssemblyCode/thumb2/$(AS_SUBDIR)/Sampling_Profiler_RAM.s" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/AssemblyCode/thumb2/$(AS_SUBDIR)/VectorsHandlers.s" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/AssemblyCode/thumb2/$(AS_SUBDIR)/VectorsTrampolines.s" />
</ItemGroup>

<ItemGroup>
<HFiles Include="$(SPOCLIENT)/DeviceCode/Initialization/MasterConfig.h" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/Diagnostics/Aborts.cpp" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/Diagnostics/FIQ_Profiler.cpp" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/Diagnostics/RamTest.cpp" />
<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/Diagnostics/RamTest.h" />
<LIB_FIRSTENTRY_OBJ Include="$(OBJ_DIR)/FirstEntry.$(OBJ_EXT)" />
</ItemGroup>
<ItemGroup>
<ExtraProjects Include="$(SPOCLIENT)/DeviceCode/cores/arm/dotNetMF_loader.proj" Condition="'$(PLATFORM_FAMILY)'=='arm'" />
</ItemGroup>
<Import Project="$(SPOCLIENT)/tools/targets/Microsoft.SPOT.System.Targets" />
</Project>

从修改后的文件看出,不用重定位的文件都以$(SPOCLIENT)/DeviceCode为路径前缀,如:

<Compile Include="$(SPOCLIENT)/DeviceCode/cores/arm/AssemblyCode/thumb2/$(AS_SUBDIR)/IDelayLoop.s" />

只有需要重定位的FirstEntry.s文件的路径前缀不同,如:

<Compile Include="$(SPOCLIENT)/Solutions/STM32F103ZE_RedCow/DeviceCode/cores/arm/AssemblyCode/thumb2/$(AS_SUBDIR)/FirstEntry.s" />

这个语句的意思是,需要编译的FirstEntry.s文件是位于我们的./Solution/[SOLUTION]/cores/ARM目录之下的,而不是的原文件。

在这里唯一需要注意的是,STM32F103ZE_RedCow是我所建立的Solution的文件夹名,如果你的Solution和我的不同,只需要直接修改即可。

分享到:
评论

相关推荐

    程序重定位.docx

    编译(compile)和链接(link),是计算机编程语言的通用处理系统。编译,是把程序源代码转换为目标文件;链接,是把目标文件转换为可执行文件。

    《GCC编译流程:从源代码到可执行程序——浅析编译原理》—— 程序的基本编译流程.pdf

    链接器还会对目标文件中的函数和变量地址进行重定位,生成最终的可执行文件。 编译流程中还涉及到库文件的链接。库文件是已经编译好的目标代码文件,例如libmath.a。GCC编译器可以将库文件链接到可执行文件中,以便...

    链接器(Linker编译器工具链符号解析、地址重定位和符号链接

    2. **地址重定位**:目标文件和库文件中的代码和数据通常都是使用相对地址(Relative Address)来表示的,需要在链接过程中将这些地址重定位到正确的位置。链接器会根据符号表中的信息,计算出每个符号在最终可执行...

    CCS编译选项深度说明

    OutPutModel选项用于设置模块是否可重定位。 20. OutputFilename:输出文件名 OutputFilename选项用于设置输出文件名。 21. MapFilename:映射文件 MapFilename选项用于设置映射文件。 22. AutoinitModel:自动...

    Linux下将源文件编译成目标文件的过程解析

    一个.c源程序需要经过预处理器生成.i文件,再经过编译器生成.s文件,再经过汇编器生成可重定位目标文件.o文件,再与其他.o文件经过链接器生成最终的可执行目标程序。 预处理阶段。主要是处理源文件中以“#”开头的预...

    uboot相关记录,start.S,uboot.lds解析

    relocate_code 函数位于 arch/arm/lib/relocate.S 文件中,该函数将.text、.rodata、.data、.rel.dyn 等段重定位到SDRAM中。 .rel.dyn 重定位 .rel.dyn 段是动态链接库的重定位表,该表记录了动态链接库中的符号...

    ELF文件格式

    在编译器生成目标文件时,会在目标文件中生成符号表和重定位表。符号表包含在文件中定义的全局符号以及在文件中引用的外部符号(外部函数或变量)。重定位表告诉链接器在哪些位置需要进行重定位操作。 链接器对编译...

    Linux系统下的ELF文件分析.pdf

    ELF文件主要有三种类型:可重定位文件、可执行文件和共享目标文件。可重定位文件包含代码和数据,可以与其他ELF文件建立一个可执行或共享的文件。可执行文件是可以直接执行的程序。共享目标文件包括代码和数据,可以...

    链接器是计算机程序开发中的一个重要工具.docx

    地址重定位:由于目标文件和库文件可能是在不同的地址空间中编译生成的,链接器需要将这些文件中的地址引用重定位到最终的内存地址。这包括修改指令中的跳转地址和数据中的地址引用。 符号解析和地址重定位通常在两...

    C语言中.h和.c文件解析(20210920191036).pdf

    主要的工作就是重定位各个目标文件的函数、变量等,相当于将个目标文件中的二进制码按一定的规范合到一个文件中。 理论上来说,C文件和头文件里的内容只要是C语言所支持的,无论写什么都可以的。但是,为什么一定要...

    最常见的VC++编译错误信息_fatal_error

    这是一个常见的编译错误,原因是编译器在寻找预编译头文件时遇到了不该遇到的文件尾。解决方法是包含正确路径的#include "stdafx.h",或者在*.cpp文件的Setting里面设置,C++选项中的分类precompiled header,选择不...

    C语言中.h和.c文件解析.pdf

    3. 编译阶段:将上一步生成的目标文件,根据一些参数,连接生成最终的可执行文件,主要的工作就是重定位各个目标文件的函数、变量等,相当于将个目标文件中的二进制码按一定的规范合到一个文件中。 4. 连接阶段:将...

    哈工大计算机系统大作业.docx

    3,汇编:将上一步汇编生成的hello.s文件翻译成可重定位目标文件hello.o,为二进制机器语言,机器语言是最底层的,计算机可以直接识别并执行的语言 4,链接:将各种代码和数据的片段收集并组合成一个单一文件的过程...

    RetDec是基于LLVM的可重定位机器代码反编译器。-C/C++开发

    反编译器不限于任何特定的目标体系结构,操作系统或可执行文件格式:支持的文件格式:ELF,PE,Mac RetDec RetDec是基于LLVM的可重定位的机器代码反编译器。 反编译器不限于任何特定的目标体系结构,操作系统或可...

    Linux下动态链接实现原理

    函数)相互引用的问题,对符号的引用本质是对其在内存中具体地址的引用,因此确定符号地址是编译,链接,加载过程中一项不可缺少的工作,这是所谓的符号重定位。  因为编译是以源文件为单位进行的,编译器此时并...

    《C深度解析》第一章 c编译、链接视频教程

    可重定位目标文件(.o)格式介绍6. 链接器链接时,符号解析和重定位做了什么事情7. 可执行目标文件的格式,以及可执行目标文件的加载、执行8. 程序内存结构介绍 代码和数据(常量、变量)是如何存放在程序的内存结构...

    6内存管理.xmind

    内存管理的功能 内存空间的分配与回收 内存空间的扩充(实现虚拟性) 虚拟存储技术、自动覆盖技术 地址转换 操作系统负责实现逻辑地址到物理地址的转换 三种方式 绝对装入 ... 可重定位

    链接器的的定义以及详细介绍

    组织地址空间:链接器还需要完成程序中各目标文件的地址空间的组织,这可能涉及重定位工作,确保所有的符号和函数都在内存中的正确位置。 作用: 链接器是编译过程的最后一步,它将各个独立编译的单元(如.o文件或....

    如何使用Keil生成bin(二进制)格式的文件--详细图文说明[整理].pdf

    + -r:打印重定位信息 + -s:打印字符表 + -t:打印字符串表 + -y:打印动态段的内容 + -z:打印代码和数据大小信息 现在,我们可以使用 fromelf 工具来生成.bin 文件。下面是具体的步骤: 1. 打开一个建好的...

Global site tag (gtag.js) - Google Analytics