有一个供应商的软件,我想与之合作.他们有一个代码库,他们只能使用IAR Embedded Workbench进行编译(据我所知,他们的代码不能用GCC编译).不幸的是,他们的硬件仅适用于他们的软件堆栈,所以我真的无法选择是否要使用它.它们将此代码分发.a为为ARM Cortex-M4 CPU编译的静态库文件(以及随附的标头).(他们不想分发来源.)为了这个讨论,让我们称之为evil_sw_stack.a.
我想使用这段代码,但我没有IAR许可证,对IAR没有专业知识.我想使用GCC.
有没有办法让IAR生成GCC可以链接到的静态库?供应商需要使用哪种编译器选项来生成这样的二进制文件?
(我猜测得到的二进制文件的ABI可以某种方式指定并设置为满足GCC的设置.)
他们的默认软件堆栈非常适合GCC,这个特定的软件堆栈是他们提供的唯一一个不是.通常,如果我有以下内容,我可以编译一段简单的示例代码:
startup_(devicename).S:GCC特定的程序集文件system_(devicename).c(devicename).ld:链接器脚本例如,我可以编译一个简单的例子,如下所示:
$ arm-none-eabi-gcc helloworld.c startup_(devicename).S system_(devicename).c -T (devicename).ld -o helloworld -D(devicename) -I. -fno-builtin -ffunction-sections -fdata-sections -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mcpu=cortex-m4 -mthumb -mno-sched-prolog -Wl,--start-group -lgcc -lc -lnosys -Wl,--end-group
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.没有警告,没有错误.
为了这个讨论,让我们称之为evil_sw_stack.a.
这就是我尝试使用它的方式:
$ arm-none-eabi-gcc evil_sw_stack.a helloworld.c startup_(devicename).S system_(devicename).c -T (devicename).ld -o helloworld -D(devicename) -I. -fno-builtin -ffunction-sections -fdata-sections -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mcpu=cortex-m4 -mthumb -mno-sched-prolog -Wl,--start-group -lgcc -lc -lnosys -Wl,--end-group
Run Code Online (Sandbox Code Playgroud)
不幸的是,这抱怨了一系列定义的函数的多个定义system_(devicename).c.也许他们不小心把它编成了这个库?或者也许IAR只是这样编译?现在,如果我尝试system_(devicename).c …
以下是故事:我正在使用AC6 Toolpack为Linux中的ARM Cortex-M0处理器开发C++软件.在我使用Keil(在windows中)(拥有自己的工具链)之前,我已经迁移到GNU-toolchain((GNU Tools for ARM Embedded Processors)5.2.1).我意识到的第一件事是; 二进制文件大小大幅增加.我已经测试了每个编译器优化(链接时间优化除外,它在内联汇编时出错,不是问题的一部分,但可能与答案有关).然后开始使用任何可用工具检查可执行文件(elf文件不是bin,gnu生成两者):objdump,readelf,nm.我发现一些符号导致尺寸增加,重要的是:' d_print_comp_inner',' d_exprlist',' d_template_args'.但不知道是什么导致这些函数出现在二进制文件中.(我使用过最小的库:nano newlib).长话短说我开始逐一消除代码以找到罪魁祸首.最后是抽象方法声明!
将功能定义为
virtual Return_type function_name(...)=0;
Run Code Online (Sandbox Code Playgroud)
代替
virtual Return_type function_name(...);
Run Code Online (Sandbox Code Playgroud)
添加45 KB和我提到的符号.这是源代码中唯一的变化.存在基类中的空定义.请注意:方法仍然是虚拟的,并在子类中被覆盖
没有抽象类的大小输出:
text data bss dec hex filename
15316 24 4764 20104 4e88 temc_discovery.elf
Run Code Online (Sandbox Code Playgroud)
抽象类的大小输出:
text data bss dec hex filename
61484 128 4796 66408 10368 temc_discovery.elf
Run Code Online (Sandbox Code Playgroud)
这里的方法是抽象的符号和他们的大小,消除了两个版本中出现的符号和他们的大小.(使用nm工具.不完整列表,大小> = 0x60的列表)
00002de4 t d_print_comp_inner
00001a34 t d_exprlist
00000ca4 t d_template_args
00000678 t d_type
00000574 t d_print_mod
000003f8 t d_encoding
000003e0 r …Run Code Online (Sandbox Code Playgroud) 我正在寻找使用arm-linux-xxx构建内核的uClinux系统,但使用arm-elf-xxx构建用户应用程序.
如果应用程序打算在linux上运行,使用arm-linux-xxx构建所有内容会不会更好?
在整个uClinux构建配置中,哪一个设置了该选项?
为什么我的静态构建需要共享库?
每隔一段时间我就会从链接器中收到这些警告......(目前正在使用openssh-5.2p1)
这些警告类似于:"在静态链接的应用程序中使用'function'需要在运行时使用glibc版本中的共享库..."
当我谷歌时,我只看到修复,而不是原因.
谢谢,陈兹
我需要使用较小版本的软件包来构建我的工具链。有没有办法通过禁用 mpc、mpfr 和 gmp 包来构建 gcc?
我正在尝试构建一个裸机臂项目。我尝试了 GNU 工具链arm-elf和arm-none-eabi. 两个工具链生成的可执行文件在转换为英特尔十六进制格式时运行良好。
我正在使用 Proteus 软件进行模拟。Proteus 支持调试 elf 和 coff 格式的可执行文件。
在我的情况下,Proteus 接受由生成的可执行文件,arm-elf但在加载由arm-none-eabi. Proteus 显示的错误信息是:
我只是file在 linux 中运行命令,将两个可执行文件作为参数,一一运行。
结果如下所示。
图像:ELF 32 位 LSB 可执行文件,ARM,EABI5 版本 1 (SYSV),静态链接,未剥离
图像:ELF 32 位 LSB 可执行文件,ARM,版本 1,静态链接,未剥离
是否有任何选项可以使用 arm-none-eabi 工具链生成与 Proteus 兼容的 elf 文件?
编辑:我的收费链版本的详细信息。
C:\SysGCC\arm-elf\bin>arm-elf-gcc.exe --version
arm-elf-gcc.exe (GCC) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO …Run Code Online (Sandbox Code Playgroud) 我有一个大文件(50 GB),我想计算其中不同行的出现次数.通常我会用
sort bigfile | uniq -c
Run Code Online (Sandbox Code Playgroud)
但是文件足够大,以至于排序需要大量的时间和内存.我可以
grep -cfx 'one possible line'
Run Code Online (Sandbox Code Playgroud)
对于文件中的每个唯一行,但这意味着n为每个可能的行传递文件,这(虽然更多的内存友好)比原始行更长.
有任何想法吗?
一个相关的问题询问在大文件中找到唯一行的方法,但我正在寻找一种方法来计算每个实例的数量 - 我已经知道可能的行是什么.
我想将一个 32 位常量加载到一个寄存器中,我发现了一个伪指令“mov32”,可以在上面执行此操作(mov32 伪指令)。然后我写了一个汇编文件,其中包括:
MOV32 r0, #0xABCDEF12
Run Code Online (Sandbox Code Playgroud)
并使用 linaro 工具链(版本 13.04)编译它:
arm-linux-gnueabihf-as -march=armv7-a -mcpu=cortex-a9 test.s -o test.o
Run Code Online (Sandbox Code Playgroud)
但失败并显示以下消息:
Error: bad instruction `mov32 r0, #0xABCDEF12'
Run Code Online (Sandbox Code Playgroud)
不知道是不是统一汇编语言的问题。以防万一,我在源代码中写了“.syntax统一”并再次测试,但也失败了。GNU 工具链是否支持 ARM 伪指令,如“mov32”、“ldr r0、=address”等?如果是,我该如何解决这个问题?谢谢。
我想在我的一个函数中使用标准c函数
void print(const char* format,...) {
char buffer[256];
va_list args;
va_start (args, format);
vsnprintf (buffer,256,format, args);
va_end (args);
sendString(buffer);
}
Run Code Online (Sandbox Code Playgroud)
错误来了
arm-none-eabi-ld -o check.elf -T /home/sanju/Arm/check/other/ROM.ld Serial.o irq.o lowlevel.o main.o startup.o \
-L/usr/arm-none-eabi/lib -lc -lg -lm
/usr/arm-none-eabi/lib/libc.a(lib_a-svfprintf.o): In function `_svfprintf_r':
vfprintf.c:(.text+0x688): undefined reference to `__aeabi_dcmplt'
vfprintf.c:(.text+0xdfc): undefined reference to `__aeabi_dcmpeq'
vfprintf.c:(.text+0x10b4): undefined reference to `__aeabi_dcmpeq'
vfprintf.c:(.text+0x168c): undefined reference to `__aeabi_uldivmod'
vfprintf.c:(.text+0x16a8): undefined reference to `__aeabi_uldivmod'
vfprintf.c:(.text+0x1a48): undefined reference to `__aeabi_dcmpeq'
vfprintf.c:(.text+0x1eac): undefined reference to `__aeabi_dcmpeq'
/usr/arm-none-eabi/lib/libc.a(lib_a-dtoa.o): In function `quorem':
dtoa.c:(.text+0x3c): …Run Code Online (Sandbox Code Playgroud) 我正在开发一个依赖于 Lauterbach JTAG 调试器硬件和软件的项目,对目标 JTAG 电缆的支持已于 2011 年 7 月终止。我们在 omap2 处理器上使用 Linux 2.6.33 内核。我们使用 gcc 4.9.2 来构建内核映像(不确定 bintools 的版本)。
对于那些不熟悉 Lauterbach 如何许可其软件的人来说,目标电缆(连接调试器和目标之间)带有支持合同日期。可以使用支持期之前和支持期结束之前的任何版本的 Lauterbach Trace-32 软件,但电缆支持结束后的任何版本都不能使用,每次会话 30 分钟的演示期除外。我们正在通过采购流程来续签电缆的支持合同,但在完成之前(可能需要几个月的时间),我们只能坚持现有的条件。
看来我们使用的工具链生成的调试信息对于 2017 年 7 月之前发布的 Trace-32 调试器软件的最后一个版本来说太新了。尝试使用以下命令加载内核映像 (vmlinux) 的符号:
data.load.elf \\path\to\vmlinux /nocode
Run Code Online (Sandbox Code Playgroud)
失败并显示类似以下内容的消息:
error: entry near offset 5432100. in file \\path\to\vmlinux (use DUMP)
Run Code Online (Sandbox Code Playgroud)
当然,最简单的解决方案是更新到 Trace-32 软件的第一个版本,该版本支持我们的工具链生成的任何 ELF/DWARF 组合。我们知道最新版本可以工作,但我们的电缆不支持该版本,并且直到我们的采购人员确定这是测试设备还是软件(它们来自不同的预算)之后才会支持。
在接下来的几个月里,我们需要一个解决方法。我正在寻找以下其中一项:
我预先感谢大家的帮助。
编辑:我不是 100% 确定工具链是生成 DWARF3 还是 DWARF4,所以我可能需要制作一个 ELF/DWARF2“vmlinux”
我们是否可以配置运行在 intel x64 架构上的 gcc 来为 ARM 芯片生成二进制文件,只需将一些标志传递给 gcc,而不使用交叉编译器。
问题
如何让[我的自定义安装] clang 查看 C++ 标头的正确位置(即我的 gcc 自定义安装)?
系统
我目前正在使用所有默认库的 RHEL 6 计算机。
在非系统目录中,我[成功]编译了 mpc、mpfr、gmp、cmake、python、gcc(4.9.3 和 8.1.0)和 clang(5.0.0 使用 gcc 4.9.3 和 6.0.0使用 gcc 8.1.0)。
gcc 配置为--prefix=... --with-gmp=... --with-mpfr=... --with-mpc=... --disable-multilib
gcc 的(及其所有依赖项)bin 目录被添加到PATH,其 lib/lib64 目录被添加到LD_LIBRARY_PATH,CC/CXX 分别设置为 [my] gcc/g++ 。
然后 clang 配置了cmake ../llvm -DCMAKE_INSTALL_PREFIX=... -DCMAKE_BUILD_TYPE=Release -DLLDB_DISABLE_LIBEDIT=True -DCMAKE_C_COMPILER=${CC} -DCMAKE_CXX_COMPILER=${CXX}. 请注意,我设置了 CMAKE_C_COMPILER/CMAKE_CXX_COMPILER,尽管我不应该这样做,因为其他一些答案说他们通过这样做修复了它,我想也许发生了一些奇怪的事情,但这并没有解决它。
问题
如果我编译这个测试文件:
#include <atomic>
int main ( int , char const** )
{
std::atomic<int> i (0) ;
i.fetch_add ( 2 ) ; …Run Code Online (Sandbox Code Playgroud) 我已经学习 C 几个月了,现在我开始更深入地研究较低级语言 - ARM 汇编,因此,我决定从一个非常基本的项目开始,制作一个汇编文件 .S,它定义了阶乘函数,然后在C中调用使用它。所以我想问是否可以用汇编来定义这么复杂的函数,并可以用作C中的另一个函数?如果您不介意,请给我一个 .S 文件的简单示例,其中函数从标准输入 num1 和 num2 加载 2 个数字到寄存器,计算 num1*num2 并返回结果已定义并可在 C 源代码中使用文件?
感谢您的阅读。如果这个问题很愚蠢,至少请给我一个方向,以便我可以自己跟踪并找出答案。