重定位编译文件

By | 09月29日
Advertisement

//=====================================================================
//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和我的不同,只需要直接修改即可。

Similar Posts:

  • 编译链接中的-可重定位目标文件

    这几天看linux程序设计,发现很多专有名词, 可重定位目标文件理解: 资料一: 汇编器所产生的目标文件至少包括三个区,即文本区(text),数据区(data)和bss区.文本区一般包括程序的代码和常量,数据区通常存放全局变量等内容,bss区用于存放未初始化的变量或作为公共变量存储空间.在一个目标文件中,其text区从地址0开始,随后是data区,再后面是bss区.而要运行程序,必须装载到内存中,所以这些区的地址需要在内存中重新安排,也就是重定位. 资料二: 编译器编译后产生的目标文件是可重定位

  • 重定位处理

    运行时链接程序在装入应用程序所需的全部依赖项之后,将会处理每个目标文件并执行所有必需的重定位. 在目标文件的链接编辑过程中,随可重定位输入目标文件提供的任何重定位信息均会应用于输出文件.但是,在创建动态可执行文件或共享库时,许多重定位无法在链接编辑时完成.这些重定位需要仅在目标文件装入内存时才知道的逻辑地址.在这种情况下,链接编辑器将在输出文件映像中生成新的重定位记录.然后,运行时链接程序必须处理这些新的重定位记录. 有关许多重定位类型的更详细说明,请参见重定位类型(特定于处理器).重定位存在两

  • MySQL重定位数据目录的内容

    <script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <s

  • 重新定位数据文件

    在ORACLE管理过程中,有时会碰到在系统中有多个磁盘,但在创建数据库时没有合理安排数据文件存储位置,或在运行过程中某些数据文件增长过快,导致某个磁盘空间使用不足,而别的磁盘空间却有很多空间未用.则需要将某些数据文件移到别的磁盘分区上,记录下过程. 确定要移动的数据文件: sql>select a.name,b.name from v$tablespace a,v$datafile b where a.ts#=b.ts#; 将要移动的数据文件所对应的表空间致于OFFLINE状态,再移动数据文件到

  • 静态编译的EXE重定位项不能多于65536个

    去年(2014年)9月份,我收到来自网友的错误报告,说易语言代码行数超过4万,静态编译的EXE启动时异常崩溃.他那个源码是在一个子程序里面写了4万多行代码,每一行都调用Win32 API函数MessageBoxA. 我(Liigo)当时仔细检查了易语言5.x静态编译相关的源代码,分析后得出初步结论:整个易程序就一个代码段(.text),编译成OBJ也位于一个Section内,而其中最多只能有65536个重定位项(WORD NumberOfRelocations).如果代码过多,重定位数目过多(程

  • 说说编译链接系统中的符号(symbol)、重定位(relocation)、字串表(string-table)和节(section)

    作者:liigo 日期:2009/11 链接:http://blog.csdn.net/liigo/archive/2009/11/23/4858535.aspx 转载请注明出处:http://blog.csdn.net/liigo 编译(compile)和链接(link),是计算机编程语言的通用处理系统.编译,是把程序源代码转换为目标文件:链接,是把目标文件转换为可执行文件.把编译和链接分成两个相对独立的子系统,是为了简化,是为了分而治之,也有基于通用性的考虑.编译器(compiler)的任务

  • 易语言 静态编译的EXE重定位项不能多于65536个

    去年(2014年)9月份,我收到来自网友的错误报告,说易语言代码行数超过4万,静态编译的EXE启动时异常崩溃.他那个源码是在一个子程序里面写了4万多行代码,每一行都调用Win32 API函数MessageBoxA. 我(Liigo)当时仔细检查了易语言5.x静态编译相关的源代码,分析后得出初步结论:整个易程序就一个代码段(.text),编译成OBJ也位于一个Section内,而其中最多只能有65536个重定位项(WORD NumberOfRelocations).如果代码过多,重定位数目过多(程

  • MASM的ORG、生成COM/EXE文件的研究、EXE重定位、入门汇编程序

    MASM的ORG.生成COM/EXE文件的研究.EXE重定位.入门汇编程序 发布时间:2011-02-26 20:32:53 技术类别:自由话题 需要确认注册邮箱后才能下载,立即确认我的邮箱 MASM的ORG.生成COM/EXE文件的研究.EXE重定位.入门汇编程序 wxleasyland 2011.2.26 .model tiny是生成COM文件,参见<汇编伪指令.DOC>http://blog.csdn.net/pizi0475/archive/2010/05/26/5626696.asp

  • 重定位stderr到文件

    freopen("d://errFile", "w", stderr);   //重定位stderr到d://errFile   fprintf(stderr,"asdfasfasd");          //向stderr中写信息,也就是向d://errFile中写信息   fclose(stdout);                        //关闭   return 0;

  • 解觉fedora 13下安装vlc 无法load module,重定位后无法恢复段prot:权限不够

    按照网上的做法下载编译,安装完成vlc 1.1.0rc后,运行总是出错. 无字幕解码器模块: VLC 不支持音频或视频格式 "XVID".很遗憾的您将没有办法修复它. 无字幕解码器模块: VLC 不支持音频或视频格式 "cook".很遗憾的您将没有办法修复它. 无字幕解码器模块: VLC 不支持音频或视频格式 "RV40".很遗憾的您将没有办法修复它. 无字幕解码器模块: VLC 不支持音频或视频格式 "wma2".很遗憾的您

Tags: