适用于arm(cortex-m3)的位置独立可执行文件(-pie)

2024-04-06

我正在使用codesourcery g++ lite(基于gcc4.7.2版本)为stm32(Cortex-m3)编程。我希望动态加载可执行文件。 我知道我有两个选择:
1.可重定位的elf,需要一个elf解析器。
2. 具有全局偏移寄存器的位置无关代码(PIC)

我更喜欢带有全局偏移寄存器的PIC,因为它似乎更容易实现,而且我不熟悉elf或任何elf库。此外,使用一些工具可以轻松地从 elf 文件生成 .bin 文件。

我尝试使用“-msingle-pic-base -fpic”编译选项和“-pie”链接选项构建我的程序,但后来出现链接错误:

...路径...ld.exe:...路径...thumb2\libstdc++.a(pure.o):重定位 R_ARM_THM_MOVW_ABS_NC 不能用于“本地符号” 制作一个共享对象;使用 -fPIC 重新编译

我不太明白错误消息。看来默认的标准 c/c++ 库不能符合我的选择,我需要获取库的源代码并根据自己的目的进行重建。
So,
1.任何人都可以向我提供有关如何使用独立于位置的可执行文件的任何有用信息/链接吗?
2.有了-msingle-pic-base选项,我不再需要太关心GOT和ld脚本了,对吧?

注意:如果没有“-pie”链接选项,我可以构建程序。但是当调用c++虚拟函数时(当我使用IDE(keil)的模拟器来调试我的程序时),程序失败。我不明白发生了什么以及我错过了什么。



-------------------------------------------------- --------------------
--添加20130314

  1. -ms单图片库选项,我就不用再太关心GOT和ld脚本了,对吧?

从我的实验来看,寄存器(r9 在我的程序中使用)应指向 got.plt 部分的开头。删除“-pie”选项,链接就会成功,(正确设置r9)然后C++虚函数调用成功。不过,我仍然认为“-pie”选项很重要,这可能会确保当前的标准库是位置无关的。有人能为我解释一下吗?



-------------------------------------------------- --------------------
-- 添加20130315
我从ARM的网站上看了一下关于ABI的文档。但这没有什么帮助,因为它们并不针对特定平台。似乎有一个EABI的概念(我使用的是sourcery的arm-none-eabi版本),但我在arm的网站上找不到任何关于“EABI”的文档。我无法从 sourcery 和 gcc 中找到有关此主题的文档。PIC 有不止一种实现,那么在非 eabi 情况下使用哪一种源 g++ 呢?我认为“-msingle-pic-base”、“-fpie”、“-pie”选项的行为记录很少 !
-------------------------------------------------- --------------------
从反汇编代码中,我刚刚发现,在“-msingle-pic-base”中,r9应该指向“.got”部分的基地址,.got部分中的指针是绝对指针变量的寻址与文章中的描述类似:共享库中的位置无关代码 (PIC) http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/。所以我仍然需要修改加载时的“.got”部分。我不知道我的程序中使用的“.got.plt”部分是什么。看来函数调用正在使用 PC 相对寻址。
如何使用“-pie”进行构建或如何链接使用“-fpic”编译的标准库对我来说仍然是一个问题
.


该错误消息告诉您重新编译 libstdc++ 库,该库是在构建 gcc 编译器时最常构建的。

因此,您必须使用 -fPIC 重新编译标准库(libstdc++、libgcc_*、libc、libm 等)并将您的项目链接到它们。

如果您依赖预构建的编译器包,那么您基本上就退出了微控制器世界。如果您自己构建编译器(顺便说一下,这并不是太困难,而是一项高级/专家任务),那么您就可以开始了。

也可以使用您拥有的编译器自行编译标准标准库。您将需要库的来源并弄清楚编译器包构建系统如何构建它们,并且您必须模仿这一点。也许这里有一些专家可以在这方面为您提供建议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

适用于arm(cortex-m3)的位置独立可执行文件(-pie) 的相关文章

  • 什么定义了类型的大小?

    ISO C 标准规定 sizeof char lt sizeof short lt sizeof int lt sizeof long 我在 BIT Linux mint 19 1 上使用 GCC 8 大小为long int is 8 我正
  • C# 异步任务比同步慢

    你知道为什么同步斐波那契方法比异步 等待更快并且比异步任务更快吗 我在每个项目方法上都使用了异步 所以主要是这是一个非常糟糕的方法 Code static int FibonacciSync int number if number 0 r
  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • C++ 指针和对象实例化

    这有效 MyObject o o new MyObject 而这并不 MyObject o new MyObject Why 关键词new 返回一个指针 http msdn microsoft com en us library kewsb
  • 预编译头和 Visual Studio

    有没有办法设置 Visual Studio 解决方案参数 以便它只创建预编译头而不构建整个解决方案 具体来说 它是一个巨大的 C 解决方案 本身有许多项目 谢谢 仅选择 pch 创建者源文件 通常是 stdafx cpp 然后编译该文件 C
  • 选择initializer_list迭代器定义

    Why std initializer list
  • asp.net core http 如果没有内容类型标头,则删除 `FromBody` 忽略

    我在 http 中使用 bodyDELETE要求 我知道目前删除主体是非标准的 但是允许的 使用时出现问题HttpClient它不允许删除请求的正文 我知道我可以使用SendAsync 但我宁愿让我的 API 更加灵活 我希望这个机构是可选
  • ASP.NET MVC 动作过滤器

    有谁知道即使在 CATCH 块中 ActionFilterAttribute 类的 OnResultExecuted 方法是否也会执行 ie CookiesActions public ActionResult Login Usuarios
  • 列表到优先队列

    我有一个 C 大学编程项目 分为两个部分 在开始第二部分时应该使用priority queues hash tables and BST s 我 至少 在优先级队列方面遇到了麻烦 因为它迫使我自己重做第一部分中已经实现的许多代码 该项目是关
  • linq where 子句和 count 导致 null 异常

    除非 p School SchoolName 结果为 null 否则下面的代码将起作用 在这种情况下 它会导致 NullReferenceException if ExistingUsers Where p gt p StudentID i
  • Windows 上本机 C++ 应用程序中的自动死代码检测?

    背景 我有一个用原生 C 编写的应用程序 花了几年的时间 大约有 60 KLOC 有很多函数和类已经死了 可能有 10 15 就像下面提出的类似的基于 Unix 的问题 我们最近开始对所有新代码进行单元测试 并尽可能将其应用于修改后的代码
  • 使用 dateTimePicker 在 DataGridView 中编辑日期

    我有一个DateTime我的 WinForms 中的专栏DataGridView 目前只能通过手动输入日期来编辑该字段 例如 2010 09 02 需要什么才能拥有一个DateTimePicker 或同等 用作编辑器 DataGridVie
  • 如何禁用基于 ValidationRule 类的按钮?

    如何禁用基于 ValidationRule 类的 WPF 按钮 下面的代码可以很好地突出显示 TextBox
  • 在 C# .NET 中对非 ASCII 字符进行编码

    我想向我的应用程序发送的电子邮件添加自定义标头 标头名称只能包含 ASCII 字符 但对于值和用户可能会输入 UTF 8 字符 我必须对它们进行 Base64 编码 此外 我还必须将它们解码回 UTF 8 以便在 UI 中向用户显示它们 最
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 如何释放字符串未使用的容量

    我正在程序中处理很多字符串 这些字符串数据在读入我的程序后的整个生命周期内都不会改变 但由于 C 字符串保留了容量 因此浪费了大量肯定不会被使用的空间 我尝试释放这些空间 但没有成功 以下是我尝试过的简单代码 string temp 123
  • 如果仅使用第一个元素,是否必须为整个结构分配内存?

    我有一个结构 其中第一个元素被测试 并且根据其值 结构的其余部分将被读取或不会被读取 在第一个元素的值指示结构的其余部分不会被读取的情况下 我是否必须为整个结构或仅第一个元素分配足够的内存 struct element int x int
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理
  • C# PasswordDeriveBytes:似乎 Salt 并不重要

    可能我误解了什么 以下代码通过 CryptDeriveKey 使用两种不同的盐生成两个相等的密钥 这是控制台结果 盐1 21 3e 18 a3 9a 8b 5f gt 键 da 89 ea 3d 91 08 20 98 20 e9 dc 4
  • 在 LP2844Z(Zebra 打印机)上的收据中包含 PNG [重复]

    这个问题在这里已经有答案了 我正在致力于创建一个基于 HTML5 画布的签名 绘图框 目前我们在服务器上将画布保存为PNG 但可以轻松地将base64字符串保存在数据库中 现在的问题是我们如何在打印的收据上添加签名 目前我们使用 GF 字段

随机推荐