问题标签 [freestanding]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
gcc - gcc:具有更高优化的独立选项导致更大的代码
当使用更高的优化标志(例如:-O3)进行编译时,gcc 将像这样汇编代码:
以使用 memset() 而不是本地循环的方式。这与添加-ffreestanding
标志有关。如this answer中所述,gcc 不能依赖任何语义考虑,因此它不能假设 memset 在此环境中具有与通常相同的含义(这似乎与文档中说 gcc 期望在提供 memset 之类的函数一个独立的环境。结果是 gcc 有点发疯了,并且似乎将其 memset 的整个内部视图内联到代码中。
使用 godbolt.org 并使用 arm gcc 7.2.1 (none) 和 compiler flags 进行测试-O2 -mthumb -mcpu=cortex-m0plus -ffreestanding
,我得到 14 行输出。更改为 -O3 会创建 62 行输出,这是一种效率相当低的方法。
在考虑独立环境时,值得仔细考虑您的优化选项!请记住,-O3 确实意味着“优化更多”,但无论代码大小或编译时间影响如何,都针对性能进行了更多优化。
是的,这是一个陈述而不是一个问题;但是我可以问这是预期的 gcc 行为还是可能是优化错误?该行为与 gcc 文档并不完全同步。
c - 如何检测 C malloc 是否可用于独立目标平台?
malloc
在 C 中,无论目标平台或编译器如何,我如何检测是否某种形式的可用?检测就够了_STDLIB_H_
吗?
我想包含一个标头实用程序函数,该函数malloc
仅在库用户已经提供时才使用。
更新:该库需要一些堆或堆栈内存分配,其数量在编译时可能知道也可能不知道。该库可以在运行时计算所需的确切内存量。因此,对于那些需要等到运行时并且可以/想要使用堆内存的人,我想让自动分配可用。但我不希望库本身加载“stdlib.h”。
c - 独立C:为什么这个函数不能根据数组的结构返回数据?
我目前正在观看有关基本图形操作系统开发的 Udemy 教程,该教程刚刚开始解释如何使用位图字体在 VBE 图形模式下呈现文本。演示者创建一个函数(由 python 脚本自动生成)通过在一组数组中查找来返回给定字符的给定行。
这里的关键点是代码使用了一组二进制数据数组,每个数组包含 13 个字符的位图,就像这样。
我认为这似乎很奇怪且不必要,所以我尝试将其重构为使用单个数组(尽管使用不同的字体),如下所示:
但是,当我尝试使用它时,根本没有文本打印到屏幕上。我能想到 3 种解释,但没有一个能完全让我满意:
-
- 由于我们的链接器只链接文本部分而不链接数据部分(链接命令为
ld -m elf_i386 -o boot/bin/kernel.img -Ttext 0x1000 boot/bin/kernel_entry.bin boot/bin/kernel.o
),因此不会链接大数组。这种解释似乎很弱,因为教程版本中的各个较小的数组链接得很好。
- 由于我们的链接器只链接文本部分而不链接数据部分(链接命令为
-
- 由于尚未实现 memcpy,因此声明启用了优化的大型数据结构会导致对 memcpy 的调用不正确。这种解释似乎也很薄弱,因为我希望得到编译器警告。
-
- 我在实施的其他地方犯了一些错误。这似乎不太可能,因为我唯一改变的是传递给打印函数的函数指针。(为了记录,我已经尝试过考虑签名和未签名的字符。没有运气。)
这个问题的根源似乎是什么?谢谢您的帮助。
如果有帮助,该项目的 makefile 如下所示:
编辑 2:可在此处找到最小可重现示例:https ://drive.google.com/drive/folders/1Z5wlXrtRbXQ1wNhBU2_YsSMovaGe7DvB?usp=sharing
gcc - 如何在旧(<9)gcc 版本上不使用 libc 进行链接?
GCC 9 引入了“nolibc”链接器选项,用于在没有 libc 的情况下进行链接?它是如何在旧版本上完成的?是否真的需要一个链接器脚本,或者是否可以通过其他一些链接器选项组合来实现这一点?