これが私のコードです:
test.cpp
class Message
{
public:
long long msgid;
char* msgStr;
};
int foo(Message* msg)
{
// TODO
// print: msg->msgid, msg->msgStr
}
int main()
{
char buf[20] = "Hello";
Message msg = new Message;
msg->msgid = 0x10;
msg->msgStr = buf;
foo(msg);
call_from_arm((void*)&foo, (void*)msg);
foo(msg);
return 0;
}
test.S
call_from_arm:
@r0 = ptrFunc
@r1 = obj
STMFD r13!, {r4-r11,r14}
MOV r8, r0 @r8 = ptrFunc
MOV r0, r1 @r0 = r1
BLX r8 @call ptrFunc
LDMFD r13!, {r4-r11,pc}
アプリケーションの実行中に、call_from_arm によって foo に渡されたパラメーター (msg のアドレス) は正しいことがわかりましたが、ヒープの内容がオフセットされているかのように、Message インスタンスに間違った値が含まれています。
このアプリケーションの出力は次のようになります。
msgid : 10, msgStr : Hello
msgid : (wrong value), msgStr : (wrong value, app may crash here)
msgid : 10, msgStr : Hello
この問題は数日間私を悩ませてきました。私を助けてください。ありがとう
クラス Message をに変更すると
class Message
{
char* msgStr;
}
文字列「Hello」の正しい値を出力できるので、問題はバイトアラインである可能性があります。long long
がキーポイントです。しかし、私はまだ理由を知りません。
I have solved this problem. AAPCS requires 8 bytes-align.
My old version code store r4-r11 & lr into stack, whitch is not 8 bytes-aligned.