我希望标题足够描述.所以这就是我想要做的和我玩弄的东西.
等等,首先,这是一个嵌入式应用程序.Atmel SAM4L微控制器,使用Atmel Studio IDE和GCC编译器/链接器.
是的,我正在编写一个引导加载程序,但是想将引导加载程序版本保存到程序存储器中,直到引导加载程序的已分配空间的末尾(假设为0x3FF0).这样,应用程序还可以通过查看特定地址来检查引导加载程序版本.此时我正忙着为应用程序更新引导加载程序本身的实用程序,但我不希望应用程序或引导加载程序使用命令或代码更新0x3FF0的版本,我希望它作为一部分. bin/.hex文件,所以当我启动引导加载程序时,版本会随之闪烁.所以目前我有一个#define用于bootloader类型,主要版本和次要版本,它们都在项目中的globals.h文件中.基本上我只想在编译时将这3个字节写入0x3FF0.
据我所知,我可以通过链接器获取相当多的技巧,但直到昨天才使用链接器脚本,并且能够用它做一些事情,但不是我想要的.该项目还创建了一个非常强大的链接器脚本,所以我也有点警惕在哪里跳转并转储我的三个字节.我知道你不能把地址指针移回去.
这是项目生成的链接描述文件
/**
* \file
*
* \brief Flash Linker script for SAM.
*
* Copyright (c) 2013 Atmel Corporation. All rights reserved.
*
* \asf_license_start
*
* \page License
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and …
Run Code Online (Sandbox Code Playgroud) 如何使用GNU ld将(某些)符号链接到特定的固定地址,以便二进制文件仍可在Linux(x86)中正常执行?不会访问这些符号,但它们的地址很重要.
例如,我有以下结构:
struct FooBar {
Register32 field_1;
Register32 field_2;
//...
};
struct FooBar foobar;
Run Code Online (Sandbox Code Playgroud)
我想链接foobar
到地址0x76543210,但通常链接标准库和应用程序的其余部分.然后,应用程序将使用foobar的地址,但不会引用它后面的(可能不存在的)内存.
这个请求的基本原理是这个相同的源可以在两个平台上使用:在本机平台上,Register32
可以简单地是一个volatile uint32_t
,但在Linux上Register32
是一个C++对象,其大小与uint32_t
定义的大小相同operator=
,然后将使用该地址对象并向具有该地址(和数据)的通信框架发送请求以在远程硬件上执行实际访问.因此,链接器将确保Register32
结构的字段引用正确的"地址".
我刚刚开始学习一些ARM编程,但我遇到了一个有点恼人的问题.我用来编译源代码的工具链是Sourcery CodeBench Lite 2013.05-23(可以在这里找到:https://sourcery.mentor.com/GNUToolchain/release2449 )
我需要的是告诉GCC或LD或OBJCOPY将'main'函数的编译字节码放在.text段的开头.
有没有办法实现这个目标?(也许通过链接器脚本?)
谢谢
我的Windows程序需要使用非常特定的内存区域.不幸的是,Windows在内存中加载了相当多的DLL,并且由于ASLR,它们的位置是不可预测的,因此最终可能会映射到我的程序需要使用的区域.在Linux上,Wine通过使用预加载器应用程序来解决此问题,该应用程序保留内存区域,然后手动加载并执行实际图像和动态链接器.我假设在Windows上不可能使用特定的方法,但是有另一种方法可以获得保证不被DLL或进程堆使用的内存保留区域吗?
如果有帮助,内存区域是固定的并且在编译时是已知的.另外,我知道可以使用增强型缓解体验工具包在注册表或每个进程中在系统范围内禁用ASLR,但我不想要求我的用户这样做.