在Windows上,我使用CodeSourcery的交叉编译器套件为ARM/Linux交叉编译程序.我使用MinGW MSYS作为我的命令解释器,并且经常会破坏我的路径和路径名.例如,为了构建我的程序,我调用了
arm-none-linux-gnueabi-gcc.exe -Wall -g \
-Wl,--dynamic-linker=/usr/lib/myrpath/ld-linux.so.3 \
-Wl,-rpath=/usr/lib/myrpath \
-I../targetsysroot/usr/include \
myprogram.c -o myprogram
Run Code Online (Sandbox Code Playgroud)
当然,我想/usr/lib/myrpath逐字插入myprogram可执行文件 - 我正在编译的ARM Linux目标不使用MinGW或MSYS.但是这里最终会涉及到它:
...
0x0000000f (RPATH) Library rpath: [C:/MinGW/msys/1.0/lib/myrpath]
...
Run Code Online (Sandbox Code Playgroud)
不完全是我想要的.如果我直接在cmd.exe命令行上调用GCC,我会在可执行文件中获得正确的rpath.如果我在MSYS命令行上调用GCC,我会得到损坏的rpath.如果我使用从cmd.exe命令行使用make运行的Makefile调用GCC,我仍然会得到一个受损的rpath(!)
我有什么想法可以关闭这种烦人的行为?
好吧,我一直潜水在低级Android编程(使用CodeSourcery工具链的本机C/C++)的浑水中.我在模拟器上试用了可执行文件,但它确实有效.我想在真实的设备上试一试.所以我插入了我的nexus并将文件推送到文件系统.然后我尝试执行二进制文件,我得到了一个权限错误.无论我如何安装它,或者我发送它的地方都没关系,我不是root,它不会让我执行它.有没有办法在非root手机上运行这样的程序?
使用RaspBerry Pi和我的计算机,我正在尝试交叉编译一个用C++编写的简单helloWorld.我正在使用Code Sourcery工具链进行linux编译.
通过TFTP将helloWorld二进制文件复制到raspBerry并使用chmod赋予它执行权限时,会出现下一个错误:
"非法指导"
如果在二进制文件上创建'文件',我会得到:"raspberry:ELF 32位LSB可执行文件,ARM,版本1(SYSV),静态链接,剥离"
这是因为我在链接时使用了"-static -static-libstdc ++".
如果我不使用静态链接,则错误为:"分段错误"
代码:
/*
* main.cpp
*
* Created on: 26/06/2012
* Author: ccortiz
*/
#include <iostream>
using namespace std;
int main(void){
cout << "Hello Cross Compilling for ARM!" << endl << flush;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我怎么能以正确的方式编译和运行我的程序?谢谢.
跑步的时候
arm-none-linux-gnueabi-gcc -print-search-dirs | grep libraries | sed 's/:/\n/g'
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
libraries
=/opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/
/opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/lib/arm-none-linux-gnueabi/4.4.1/
/opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/lib/
/opt/codesourcery/arm-none-linux-gnueabi/libc/lib/arm-none-linux-gnueabi/4.4.1/
/opt/codesourcery/arm-none-linux-gnueabi/libc/lib/
/opt/codesourcery/arm-none-linux-gnueabi/libc/usr/lib/arm-none-linux-gnueabi/4.4.1/
/opt/codesourcery/arm-none-linux-gnueabi/libc/usr/lib/
Run Code Online (Sandbox Code Playgroud)
当交叉编译一些包时,它会使我的生活更容易附加到这些路径.我知道-L选项,我想使用它,但许多软件包在交叉编译时不尊重它,而且使用它与代码源会导致问题.(有关详细信息,请参阅本文末尾).基本上我有一个完整的目录树,其中包含编译包所需的所有文件,我想将该目录树添加到默认搜索路径中.例如,-print-search-dirs也将输出类似于的路径:
/target/usr/lib
/target/lib
Run Code Online (Sandbox Code Playgroud)
除了已经列出的路径.我不是在寻找一个具有代码性的特定答案,因为我有几个可以使用的工具链.
对于那些好奇的人,这是codeourcery安装的错误:
arm-none-linux-gnueabi-gcc test.c
Run Code Online (Sandbox Code Playgroud)
作品
arm-none-linux-gnueabi-gcc -L/usr/arm-unknown-linux-gnueabi/usr/lib test.c
Run Code Online (Sandbox Code Playgroud)
失败了:
/lib/libc.so.6: file not recognized: File format not recognized
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
显然它正在抓住主机的libc.我已经看到这种情况发生在一个以上的工具链上,但不是全部.
回应评论: 这是输出
arm-none-linux-gnueabi-gcc -L/usr/arm-unknown-linux-gnueabi/usr/lib test.c -v -Wl,-verbose
Run Code Online (Sandbox Code Playgroud)
Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with: /scratch/julian/2010q1-release-linux-lite/src/gcc-4.4-2010q1/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-arch=armv5te --with-gnu-as --with-gnu-ld --with-specs='%{funwind-tables|fno-unwind-tables|mabi=*|ffreestanding|nostdlib:;:-funwind-tables} %{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --enable-shared --disable-lto --enable-symvers=gnu … 我正在使用mbxxx目标处理Contiki 2.7.在构建我的代码时,链接器抱怨.ARM.exidx和.data部分的重叠.在使用链接器脚本contiki-2.7/cpu/stm32w108/gnu-stm32w108.ld进行了一些修补之后,我通过替换修复了问题:
__exidx_start = .;
__exidx_end = .;
Run Code Online (Sandbox Code Playgroud)
有:
.ARM.exidx : {
__exidx_start = .;
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
__exidx_end = .;
} >ROM_region
Run Code Online (Sandbox Code Playgroud)
后来当我试图通过使用objdump -h看到其他一些示例应用程序的标题列表时,我没有找到这个特定的.ARM.exidx部分,而它存在于我的应用程序中.谷歌搜索.ARM.exidx让我知道它用于一些c ++异常处理.由于我的代码是纯C代码,为什么这部分出现在我的代码中?通常.ARM.exidx存在于代码中,它的实用性是什么?
================================================== ================================
嗯不,我没有任何这样的编译器选项.我实际上正在使用AxTLS api并撕掉证书处理代码并将其移植到contiki.在进一步的挖掘中,我在bigint实现中发现了一个可疑的行为.简而言之......这是bigint.c文件中函数的主体:
static bigint *bi_int_multiply(BI_CTX *ctx, bigint *bia, comp b)
{
int j = 0, n = bia->size;
bigint *biR = alloc(ctx, n + 1);
comp carry = 5;
comp *r = biR->comps;
comp *a = bia->comps;
check(bia);
/* clear things to start with */
memset(r, 0, ((n+1)*COMP_BYTE_SIZE));
do …Run Code Online (Sandbox Code Playgroud) 我想看看我正在使用的编译器调用定义的所有宏.有没有办法做到这一点?我在手册中看到它说你可以使用,cpp -dM 但这对我不起作用.也许我做错了什么?
当我跑:
cpp -dM
Run Code Online (Sandbox Code Playgroud)
我从预处理器中得不到任何输出.如果我尝试-dM在gcc上添加选项,我没有注意到任何差异.
我正在使用STR32(Cortex-M3)上的FreeRTOS,并使用ST的CMSIS库来引导所有内容.
CMSIS库SVC_Handler在启动".s"文件中定义弱符号.必须在某处重写它才能将ISR置于中断向量表中.FreeRTOS定义vPortSVCHandler,这是我想要处理SVC中断的ISR.
我想使用我的应用程序代码(即没有修改FreeRTOS或CMSIS源代码)将两者"粘合"在一起.我认为别名是工作的正确工具,所以我尝试了这个(在一个单独的源文件main.c中):
void SVC_Handler(void) __attribute__ ((alias ("vPortSVCHandler")));
Run Code Online (Sandbox Code Playgroud)
这导致: error: 'SVC_Handler' aliased to undefined symbol 'vPortSVCHandler'
事实证明,根据GCC文档http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html,为了使用该alias属性,您不能在翻译单元之外别名.所以我想我会尝试extern将符号转换为main.c,如下所示:
extern void vPortSVCHandler( void ) __attribute__ (( naked ));
void SVC_Handler(void) __attribute__ ((alias ("vPortSVCHandler")));
Run Code Online (Sandbox Code Playgroud)
这会产生相同的错误.有什么建议???
我真的想避免修改任何一个库.我知道我可以编写一个SVC_Handler简单调用的函数vPortSVCHandler,但这可能会给ISR增加不必要的开销(可能取决于优化设置).注意:FreeRTOS示例通过自定义启动文件实现此目的.我正在寻找一种方法来从C 或我的链接器脚本执行此操作.
我正在调试ARM的代码源版本的gdb(即arm-none-eabi-gdb)并尝试生成核心文件以供以后检查.OpenOCD是我的GDB目标.所有gdb告诉我,当我运行'gcore'或'generate-core-file'时,"无法创建corefile".有什么建议?通常可以使用远程目标进行核心转储吗?
我正在使用Raisonance的Ride7/Codesourcery(又名Sourcery CodeBench Lite)和STM32F4开发裸机HMI平台.
我将在这个系统中使用C++异常,但是我抛出的任何异常都以写入stderr的"Terminate called recursively"错误结束.
重现问题的代码:(main.cpp)
int main(void)
{
try {
throw 1;
}
catch (...) {
printf("caught");
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过Raisonance和其他来源的解决方案,并且没有收到任何可行的帮助.
潜在问题/解决方案1:
我已经在其他论坛上问过,他们提到我需要在我的启动程序集文件中调用静态构造来初始化展开表(至少这是我认为他们正在讨论的内容),但我不知道如何做到这一点.
潜在问题/解决方案2
我还发现了binutils/gas中的一个错误,可能是我的问题的根源(http://sourceware.org/bugzilla/show_bug.cgi?id=13449).我一直在尝试使用这个补丁来构建我自己的工具链版本,但这已经变成了自己的项目,并且还没有成功.
问题
我是否需要在代码中执行某些操作才能使用C++异常,或者这可能是工具链中的错误?如果是前者,请详细说明.
我喜欢使用犰狳线性代数库.将八度.m文件移植到C++时变得非常好,特别是当你必须使用本征方法时.
但是当我不得不从我的原生香草G ++中取出我的程序并将其转储到我的ARM处理器上时,我遇到了问题.因为我花了几个小时糊涂我的方式虽然我想分享,所以其他人可能会避免一些挫折.
如果其他人可以添加任何其他我会喜欢它.这是我用来解决这个问题的过程,肯定不是唯一或最好的方法.