问题标签 [eabi]
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.
arm - ARM 中的 ptrace(PTRACE_SYSCALL) 无法正常工作
我正在尝试使用ptrace
函数(不在shell中使用ptrace,我的意思是ptrace
在代码中使用)跟踪ARM(Android armeabi-v7a)中的系统调用。下面是我写的代码。
下面是执行的结果。
我了解到 ARM EABI 将寄存器设置R0
为R6
(argument) 和R7
(system call number) 以执行系统调用。但是,上述代码的结果略有不同。R0
register有R6
系统调用参数是正确的,但 registerR7
只有 0 和 1 重复。问题是我不知道哪个寄存器有系统调用号。从上面的代码执行结果可以看出,没有一个寄存器的值看起来像系统调用号。甚至寄存器SP
的值也根本不像堆栈指针。(想必寄存器的值R7
好像是系统调用进出的意思)
你能解释一下我做错了什么吗?
unit-testing - 有没有办法在禁用 pthreads 的情况下构建 cpputest?
我打算在我的项目中使用 cpputest 作为测试框架,我需要交叉编译,因为它将在 ARM 平台上使用。我用于 ARM 开发的编译器是 arm-gcc,它是在禁用 pthreads 的情况下构建的。因此,我需要在没有 pthread 的情况下构建 cpputest。目前我正在遵循构建cpputest的自动工具方法。任何帮助将非常感激。
gcc - 我如何确定图书馆不使用 wchar_t
当我在新平台上链接库时,出现以下错误:
foo.o 使用 2-byte
wchar_t
但输出是使用 4-bytewchar_t
;wchar_t
跨对象使用值可能会失败
我搜索了stackoverflow并找到了这个线程:如何设置2字节wchar_t输出?
我在那里看到了答案,这真的很有帮助
Tag_ABI_PCS_wchar_t
如果你真的相信它们是不可知的,你可以从你的内部 gcc 对象二进制文件sizeof(wchar_t)
中去除标签。
有没有一种自动的方法可以确定该库是sizeof(wchar_t)
不可知的?
谢谢
linux - ARM C++ 交叉编译:通常的默认包括可用?
我正在使用 arm-none-eabi-gcc/g++ 工具链为 ARM Cortex_M7 编译裸机 C++,它工作正常,在我的板上闪烁漂亮的固件。
现在,当/如果我想包含“好旧的”C++<mutex>, <queue>, <iostream>...
文件时,我会遇到编译错误的瀑布(我不会费心粘贴到这里,因为我知道这些不相关..)
这是预期的吗,因为这些根本不可用,我应该作为一个男人,像我现在所做的那样自己编写自己的队列、互斥体、...类(听起来有点像重新发明轮子)还是我缺少“系统根”?但是……世界上每一个 ARM-Cortex_Mx 架构都有这样的东西吗?
我可能对在 sysroot、std、linux 之间阅读此内容感到困惑,也许我需要下载一个适当的工具链(arm-none-linux-gnueabi-g++?),其中包含一个特定的“sysroot”(包含我的所有包含和库)目标)因为我在Linux 环境中编译,即使我的目标不会在 Linux(裸机)上运行?
恐怕我不能用谷歌搜索合适的主题(或者用谷歌搜索错误?)
感谢您的澄清!
编辑:
包含 and 时出错:
$~>制作
CXX obj/src/hot_queue.o
在 /usr/arm-none-eabi/include/c++/9.2.0/ext/string_conversions.h:43 包含的文件中,
/usr/arm-none-eabi/include/c++/9.2.0/cstdio:127:11: 错误:'::printf' 尚未声明
127 | 使用 ::printf;
| ^~~~~~
/usr/arm-none-eabi/include/c++/9.2.0/cstdio:134:11: 错误:'::scanf' 尚未声明 134 | 使用 ::scanf;
make: *** [mak/Makefile.sam.in:359: obj/src/hot_queue.o] 错误 1
实际上,另一个很好的例子是:这次 g++确实找到了正确的文件……但无法编译它……宏错误:
编辑:
包括在我的代码中:
因此,确实感觉从 ATMEL/Microchip 的库/驱动程序中加载的“printf()”保留名称 ovlerloading 正在毒化 std 包含的使用。
performance - ARM softfp 与 hardfp 性能对比
我有一个带有 Linux 操作系统的基于 ARM 的平台。尽管其基于 gcc 的工具链同时支持 hardfp 和 softfp,但供应商建议使用 softfp,并且该平台附带了一组标准和平台相关的库,这些库只有 softfp 版本。
我正在制作基于 OpenCV 和 tensorflow lite 的计算密集型 (NEON) AI 代码。按照供应商指南,我使用 softfp 选项构建了这些。但是,我感觉我的代码与其他有点相似的 hardfp 平台相比表现不佳。
代码性能是否取决于 softfp/hardfp 设置?我是否正确理解编译器为构建我的程序而生成的所有 .o 和 .a 文件也使用了 softfp 约定,这不太有效?如果是这样,是否有任何棘手的方法可以在内部使用 hardfp 调用约定,而对外部库使用 softfp?
embedded-linux - ARM926 处理器的 TensorFlow lite 构建失败
全部,
我正在尝试为我的目标处理器 ARM926EJ-S 处理器(ARM5te 架构)构建 tensorflow lite。我已经从 Rasp PI 构建脚本和设置中为我的目标处理器复制了构建脚本和构建设置。这是我在 arm926_makefile.inc 中的目标处理器的构建设置:
构建脚本成功构建了一堆文件。但是,它主要抱怨数学函数,如 std 命名空间的 round、atoi、min、max。我的目标处理器的工具链版本是 arm-linux-g++ (Buildroot 2014.08) 4.9.2。相同的 tensorflow lite 使用 Pi 工具链版本 arm-linux-gnueabihf-g++ (GCC) 8.3.0 成功构建。
我确实看到了在我的工具链中声明和定义的那些数学函数,但它们没有被 tensorflow-lite 构建识别。顺便说一句..我尝试使用 global ::round() 然后它也需要替换很多地方和其他数学函数。必须有简单的方法或传递一些配置才能从我的工具链中启用这些功能。
有人可以指出我为 ARM926 构建 tensorflow-lite 的正确方向吗?
以下是我的工具链中的构建错误:
顺便说一句..我还尝试使用最新的 Rasp Pi 工具链为我的目标处理器构建 tensorflow lite,使用编译选项 -march=armv5te 和 -mcpu=arm926ej-s。它构建但不运行 - 我认为 rasp pi 工具链不会为 ARM926 和 ARMv5te CPU 架构生成正确的机器代码。
我将不胜感激并欢迎任何指针或想法来解决 ARM9 处理器的这个 tensorflow-lite 构建问题。
谢谢,手臂
gcc - 什么是 __XSI_VISIBLE?
我正在gcc-arm-none-eabi-8-2019-q3-update
为用作编译器的嵌入式系统开发 C/C++ 项目。
我添加了strptime
函数的使用,time.h
但最初它是未定义的,我在编译器包含中找到:
所以,我解决了这个问题:
现在它可以工作但是:
- 我做了什么?
- 什么是 __XSI_VISIBLE?
- 它是干什么用的?
- 为什么这个编译器默认保持为 0?
c - 自写的简单 memset 不适用于 ARMv7 上的 -03 eabi gcc
我在 c 中编写了一个非常简单的 memset,它在 -O2 之前都可以正常工作,但在 -O3 之前就不行了……
内存集:
...在使用 -O2 时编译为该程序集:
这对我来说很有意义。我注释了这里发生的事情。
当我用 -O3 编译它时,程序崩溃了。我的 memset 反复调用自己,直到它吃掉整个堆栈:
我无法弄清楚这个优化版本应该如何在没有任何strb
或类似的情况下工作。如果我尝试将内存设置为“0”或其他内容并不重要,因此该函数不仅在 .bss(零初始化)变量上调用。
(1) 这是一个问题。当函数因为 'n' 为零而没有提前退出时,这个推送会在没有匹配的 pop 的情况下无休止地重复,因为它由 (2) 调用。我用UART打印验证了这一点。r2 也从未被触及,那么为什么与零的比较应该成为真的?
请帮助我了解这里发生了什么。编译器是否假设了我可能无法满足的先决条件?
背景:我在我的裸机项目中使用需要 memset 的外部代码,所以我自己开发了。它只在启动时使用一次,而不是性能关键。
/edit:使用以下选项调用编译器:
gcc - crosstool-ng 的 LD 在编译内核时给出“源对象 a/b/built-in.o 具有 EABI 版本 5,但目标 b/built-in.o 具有 EABI 版本 0”
我刚刚为“arm-unknown-eabi”创建了一个带有 crosstool-ng 的 gcc11 交叉编译器来编译我的内核(用于 msm8974 芯片组的 android),但是在链接的某个时刻,LD 给出了这个关于 EABI 版本的错误,但是目标文件甚至不存在。这些是 crosstool 工具链的组件:
- binutils-2.34.tar.xz
- gcc-git-46a58c77.tar.bz2
- gettext-0.20.1.tar.xz
- gmp-6.2.0.tar.xz
- isl-0.22.tar.xz
- libiconv-1.16.tar.gz
- mpc-1.1.0.tar.gz
- mpfr-4.0.2.tar.xz
- ncurses-6.2.tar.gz
- newlib-3.3.0.tar.gz
给出错误的完整命令是这样的:
- /root/x-tools/arm-unknown-eabi/bin/arm-unknown-eabi-ld -EL -r -o drivers/gpu/built-in.o drivers/gpu/drm/built-in.o drivers/ gpu/ion/built-in.o
- /root/x-tools/arm-unknown-eabi/bin/arm-unknown-eabi-ld:错误:源对象驱动程序/gpu/ion/built-in.o 具有 EABI 版本 5,但目标驱动程序/gpu/built -in.o 有 EABI 版本 0
- /root/x-tools/arm-unknown-eabi/bin/arm-unknown-eabi-ld: 未能合并文件驱动程序/gpu/ion/built-in.o的目标特定数据
查看这些文件:
- drivers/gpu/built-in.o:无法打开“drivers/gpu/built-in.o”(没有这样的文件或目录)
- drivers/gpu/drm/built-in.o:ELF 32 位 LSB 可重定位,ARM,版本 1 (ARM),未剥离
- drivers/gpu/ion/built-in.o:ELF 32 位 LSB 可重定位,ARM,EABI5 版本 1 (SYSV),未剥离
真正的目标(drivers/gpu/built-in.o)甚至不存在。DRM 之一(不显示为 EABI5)虽然很小(320 字节,我认为它是由 AR 创建的?)。
使用另一个工具链,一切都与这个完全相同的内核代码、Makefile 等配合得很好。我之前使用的是 musl gcc 10。