问题标签 [arm-none-eabi-gcc]
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.
c - arm-none-eabi-gcc(错误:初始化元素不是常数)
我正在阅读Daniele Lacamera的《嵌入式系统架构》一书。在第 4 章,启动过程中,我们创建了中断向量表(对于 ARM Cortex M4),如下所示:
没有显示如何END_STACK
编辑extern
,所以我这样做了:
链接描述文件类似于以下内容:
我收到以下错误:
处理此问题的正确方法是什么?是否可以将其转换为函数的地址,或者我应该仅为堆栈指针创建一个新部分?
我试过洒const
在extern
and cast 上,但无法解决错误。
windows - 'make' 程序不是内置在 gcc-arm-none-eabi 库中吗?
我的英语很差,因为我不是以英语为母语的人。我希望你能理解。
我在https://developer.arm.com/tools-and-software/open-source-software/developer-tools/上下载了 gcc-arm-none-eabi-9-2020-q2-update-win32.exe 版本gnu-工具链/gnu-rm/下载
'make' 程序不是内置在 gcc 库(或 gcc-arm-none-eabi)中吗?还是我使用了“make”命令错误?
如果有人能告诉我如何解决这个问题,我将不胜感激
感谢您的阅读。
arm-none-eabi-gcc - arm-none-eabi-gcc 代码程序如何在 x86 机器上运行?
这个论坛里的很多问题都是从“为什么我的代码不能运行...”开始的
我在 Ubuntu 18.04 上开发,在笔记本电脑(Windows x86)上作为 VM 机器运行。以下用 gcc 编译和链接的程序运行良好并显示 64 位地址。
char *s = "Hello\n"; printf ("Hello at address: %p\n", s);
我的假设是 arm-none-eabi 以系统裸机为目标。当然,我并不是想在裸机上运行上述程序。但我试图了解交叉编译是如何工作的。
与 arm-none-eabi-gcc (从 Ubuntu 安装)编译和链接的同一程序表明很多缺少引用(_exit ...等) - 正常。创建的代码是 ARM 汇编语言,我使用 arm-none-eabi-objdump 进行了验证。
在加载时添加选项 --specs=nosys.specs 可以解决缺少的引用 - 正如预期的那样。当我在 Ubuntu 上运行它时,会自动调用 QEMU 并出现分段错误。我对分段错误并不感到惊讶,但 QEMU 的自动启动是出乎意料的。
将选项更改为 --spec=rdimon.specs 也可以解决缺少的引用 - 正如预期的那样。但是尽管创建的汇编代码是 arm,但它在 Ubuntu (x86) 上运行。显示的地址为 32 位。
我知道 rdimon.specs 与半托管有关,但我认为这仅在程序在目标(arm 处理器)上运行并与运行 gdb 的主机通信时才被激活。显然我错了。
很抱歉这么长的序言......简单的问题:我的 arm 代码是如何在 x86 上运行的?
linker - 链接时 GCC/Clang 之间的差异
由于 C++ 编译时间大大缩短,我最近添加了使用 Clang 而不是 arm-none-eabi-gcc 工具链为 ARM Cortex-M4 微控制器编译项目的选项。整个过程运行得非常顺利,我很快就有了 ELF 和 HEX 文件。直到昨天晚上我才注意到 ELF 文件实际上差异很大......
在我继续之前,让我们检查一下 GCC 生成的 ELF 以获得某种基线。
GCC 的 ELF 包含以下部分(除了调试内容)
但是尽管 .data 和 .bss 标有“A”(alloc)标志,但仅加载以下内容
到目前为止,一切都很好。
当我尝试从 Clang 生成的 ELF 创建二进制文件时,问题出现了。这些文件的大小(256MB)与我的预期相去甚远。现在,如果您不熟悉 ARM 微控制器,它们通常包含位于不同地址位置的 FLASH 和 RAM 存储器(例如,如上所示,FLASH 为 0x0800'0000,RAM 为 0x2000'0000)。所以我已经对发生了什么有些怀疑......我检查了我的链接器脚本并在每个单独进入 RAM 的部分上放置了一个 NOLOAD 指令。问题解决了?
嗯...不是真的。事实上,我的二进制文件变得更大了。
我们来看看 Clang 的 ELF。尽管我使用 -fno-unwind-tables 和 -gc-sections 进行编译,但 Clang 似乎并没有删除展开部分(ARM.exidx),这让我有点烦恼,但好吧,我可以忍受那些 16B。
现在这是它变得有趣的地方,我不知道发生了什么。什么是 GNU_RELRO 和 GNU_STACK 以及它是如何结束的?为什么 GNU_STACK 位于地址 0。此条目是否有可能使我的二进制文件膨胀?
进一步的问题:
- 尽管以前在链接描述文件中没有 NOLOAD 指令,但 GCC 如何能够删除所有 RAM 部分?
- 在 Clang 的 ELF 上运行大小将我在链接描述文件中定义的最小堆栈大小计入 .data 部分,而在 GCC 的 ELF 上则没有。那个怎么样?我的链接器脚本包含一个看起来像这样的部分
- 但据我所知,这应该只“检查”至少有足够的 RAM 来覆盖我定义的最小堆和堆栈大小。该部分实际上不包含任何内容,那么它如何计入.data?
我知道在实际创建二进制文件时可以使用 objcopy 删除不需要的部分,但我真的很想了解 GCC 和 Clang 之间的那些细微差别。
/edit 我刚刚注意到我的 ._user_heap_stack 部分具有不同的类型,具体取决于编译器(NOBITS 与 PROGBITS)。猜猜这解释了为什么它被计入.data ...
/edit 现在是@ LLVM 上的(潜在)错误 https://bugs.llvm.org/show_bug.cgi?id=46299
/edit 并从 lld 10.0.1 关闭 https://bugs.llvm.org/show_bug.cgi?id=46225
debugging - GDB 便利变量不会在 .gdbinit 中展开
我gdb
使用一个.gdbinit
文件运行,该文件有一些不会扩展的便利变量。
1. 我的设置
我编写了以下.gdbinit
文件以通过 blackmagic 探针将可执行文件闪存到微控制器(请参阅https://github.com/blacksphere/blackmagic/wiki):
blackmagic 探针将自身连接到一个 COM 端口,该端口在一台计算机上与另一台计算机上可能不同。因此,我不想在.gdbinit
文件中硬编码。GDB 便利变量看起来是最优雅的解决方案:
https://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_59.html
所以我$com
在.gdbinit
文件中使用了便利变量,并在调用 GDB 时在命令行中定义了它:
2.错误
GDB 启动但抛出错误消息:
看起来 GDB 无法识别$com
便利变量。所以我检查 GDB 是否实际存储了变量:
这证明 GDB 正确地将其存储为"COM9"
. 因此,问题在于未能扩展它。
3. 更多试验
$com
当我观察到执行时扩展失败时.gdbinit
,我认为直接在 GDB 中发出命令可能会起作用:
但错误仍然存在。
4. 问题
您知道一种使 GDB 中的便利变量起作用的方法吗?或者您知道实现相同目标的另一种机制吗?
5.解决方案
谢谢@Mark Plotnick 的回答!正如您所建议的,我为我的.gdbinit
文件提供了以下内容:
COM9
但是,在调用 GDB 时,我必须删除参数周围的引号。所以而不是:
我以这种方式调用 GDB:
现在它起作用了!你救了我的一天!
c - 带有 cmake4eclipse 的 Eclipse:编辑器无法识别 CMakeLists.txt 中定义的符号
- 视窗 10 版本 1809
- 面向 C/C++ 开发人员的 Eclipse IDE(版本:2019-06 (4.12.0))
- cmake4eclipse 2.1.1
- cmake 版本 3.17.0
- GNU Make 4.2.1
一个简单示例项目的存储库:https ://bitbucket.org/ChristianW/cmake_driven_example_arm-none-eabi-gcc/src/master/
使用 arm-none-eabi-gcc 编译器时,Eclipse C/C++ 编辑器无法识别我在 CMakeLists.txt 中设置的符号。
使用 gcc 编译器时,Eclipse C/C++ 编辑器会识别我在 CMakeLists.txt 中设置的符号。
在这两种情况下,构建项目都是有效的。任何想法这里有什么问题?
亲切的问候,克里斯蒂安
编辑:CMakeLists.txt 的内容
c - 在#pragma pack(push,ALIGNMENT) 中作为宏传递的对齐会导致代码生成硬故障
我使用 9-2020-q2-update 和 8-2019-q3-update arm-none-eabi 工具链的以下代码遇到了硬故障:
在#pragma pack
gcc 中将对齐定义为宏生成以下代码-O0
:
r7
包含s
未与 4 字节边界对齐的值。strd
产生硬故障。
当我使用时生成正确的程序集#pragma pack(push, 1)
:
有没有办法正确地将定义为宏的对齐传递给#pragma pack
?我在整个代码库中都有打包的结构定义。有一些内存受限的平台,我想将它们对齐到一字节边界和一些平台,它不是那么重要,性能提升会很好。将对齐定义一次并在所有 pragma 中使用会很方便。
gnu-make - 在包含带有 stm32f4xx 的 makefile 的文件时,我遇到了麻烦
我开始使用 Linux,在我的项目gcc-testing中使用一些 stm32f4 库时遇到了一些麻烦。所需的所有 CMSIS 程序都在 STM32F4_Discovery_FW_V1.1.0 内部,项目安排如下:
main.c 和 system_stm32f4xx.c 使用 STM32F4_Discovery_FW_V1.1.0/Libraries/CMSIS/ST/STM32F4xx/Include 中的 stm32f4xx.h 文件我从终端得到的错误是:
我的制作文件:
希望enyne可以帮助解决这个问题。
arm - GNU Arm 嵌入式工具链 | arm-none-eabi-gcc 选项:Thumb (-mthumb) 和 Arm (-marm) 状态有什么区别?
Thumb (-mthumb)
我有一个可能微不足道的问题,但是和state有什么区别Arm (-marm)
,为什么大多数教程都建议使用Thumb
state?
我很好奇这到底是什么意思?它与什么有关?
最好的!
arm - arm-none-eabi-gdb:加载共享库时出错:libncurses.so.5:无法打开共享对象文件:没有这样的文件或目录
Ubuntu 20.04.1 LTS 64 位 3.36.3 Gnome Intel core-i7-975H 31.2GiB 内存 1.6 TB 磁盘空间 有我的流感疫苗 COVID-19:否定,但我很无聊,反正哪儿也不去...
我尝试了一些修复,包括这个:
消息“无法运行 arm-none-eabi-gdb:找不到 libncurses.so.5”
但没有爱。我仍然继续收到同样的错误。我正在尝试使用 Arduino IDE v1.8.13 刷新软件设备。GDB版本在这里:
libncurses 版本在这里:
我不知道还有什么可以尝试或检查的。有人会对进一步检查有什么想法吗?
@MarkPlotnick - 我跑了 ls -ld $(dpkg -S libncurses.so.5),结果:
ls -ld $(dpkg -S libncurses.so.5)
然后我通过尝试安装它来专门检查是否安装了 libncurses5:i386,它显示:
我又试了一次,有点不同:
然后 libudev1:i386 是唯一要安装的软件包。但是,如果我尝试找到该文件:
然后我在这个位置得到五个文件:
就像薛定谔档案...