djyos 发表于 2009-8-22 11:46:15

请教高手,关于gcc编译cm3的问题。

用了gnuarm 和sourcery两个版本的gcc4.3.2 for cortex-3,单独编译C代码和汇编代码都没有问题,能够正确使用thumb-2指令,但在C代码调用汇编函数时都出了问题。
gnuarm会自动产生一小段thumb-arm状态转换代码,并把这段代码放在0地址,谁不知道cm3的0地址该放什么?
sourcery则“聪明”了一点,用blx指令切换状态,想在cm3中切换到arm状态,不是找死嘛,fault 伺候。

有没有高手知道是什么原因?

minux 发表于 2009-10-13 17:26:36

你的汇编函数是怎么写的?

bluelucky 发表于 2009-10-13 19:37:12

是不是还有哪些需要设置CPU类型的地方

djyos 发表于 2009-10-13 19:59:28

调用newlib库里的汇编函数也一样。

minux 发表于 2009-10-15 21:40:45

怎么可能?

对于C语言来说,调用啥语言写的函数都是一样的(前提你那个语言写的函数遵循ABI)。

比如你写个a.c:
extern int f(int);
int g(int x) {
   return f(x);
}

然后你在b.s里面实现了f()函数,请问,编译a.c时候,编译器难道知道你的f()函数是汇编写的?
然后聪明地生成错误代码?
我刚才试验了,gcc version 4.3.3 (Sourcery G++ Lite 2009q1-161)绝对没有这个问题,也不可能有这个问题。

再者,生成blx指令也不一定不对,只要还是转换到thumb状态就不会有fault,这个指令的地址是linker生成的,它会根据你连接的函数
类型确定地址的最低位是0还是1.

djyos 发表于 2009-10-15 22:27:46

真的吗?我也试过gcc version 4.3.3 (Sourcery G++ Lite),是不是 2009q1-161就不记得了,你把可执行文件dump帖出来看看。
我这里dump出来的是:
blx偶数地址
偶数地址就表示要切到arm状态啊。
用keil加载elf文件调试,则直接显示“非法指令”

minux 发表于 2009-10-16 01:13:48

可是我不管调用啥函数都是bl调用的啊,我用-S生成的汇编,我认为ld不会改变指令为blx的。

还是那句话,C编译器不会根据你调用汇编就生成错误代码啊。

gzhuli 发表于 2009-10-16 01:50:23

把编译参数贴上来看看吧。

020gzh 发表于 2009-10-30 15:28:48

我也遇到
Sourcery G++ Lite 2009q1-161 for ARM EABI
C代码:
void (*pFun)(void);
pFun= (void (*)(void))0x200B8;
pFun();
生成汇编:
40:   pFun= (void (*)(void))0x200B8;
0x00017248 F64162FCMOVW   r2,#0x1EFC
0x0001724C F2C10200MOVT   r2,#0x1000
0x00017250 F24003B8MOVW   r3,#0xB8
0x00017254 F2C00302MOVT   r3,#0x02
0x00017258 6013      STR      r3,
41:   pFun();
0x0001725A F64163FCMOVW   r3,#0x1EFC
0x0001725E F2C10300MOVT   r3,#0x1000
0x00017262 681B      LDR      r3,
0x00017264 4798      BLX      r3--------------------此处用了BLX,导致fault
页: [1]
查看完整版本: 请教高手,关于gcc编译cm3的问题。