基本的に、C 関数の長さをバイト単位で取得する信頼できる方法を見つけようとしています。
関数のアドレスと、それに続く別の関数のアドレスを使用することを提案する人もいます。信頼できるとは思えないため、この方法は使用したくありません。コンパイラは物事を動かすことができますが、それは少しハックっぽいようです.
私が思いついた解決策は、関数の最初と最後に 2 つのラベルを使用することです。次のラベルを宣言しました。
__asm__ __volatile__("func_start/end:");
さて、私の問題は、これらのラベルのアドレスを C の変数に戻すのに問題があることです。
ここに私がすでに試したいくつかのコードがあります:
unsigned int addr, len;
__asm__ __volatile__("mov $func_start, %[address]\n\t"\
"mov $func_end, %[length]\n\t"\
: [address]"=r"(addr), [length]"=r"(len));
__asm__ __volatile__("mov %0, $func_start \n\t"\
"mov %1, $func_end\n\t"\
: "=r"(addr), "=r"(len));
これらの例は両方とも、コンパイル中に「ARM register expected」というエラーを出します。私は ARM アセンブリ (x86 は言うまでもなく) の経験があまりないので、何が問題なのかわかりません。次の x86 コードを ARM に移植しようとしました。
__asm__ __volatile__("movl $enc_start, %0\n\t"\
"movl $enc_end, %1\n\t"\
: "=r"(addr), "=r"(len));
私は明らかにここで何か間違ったことをしています。誰かが私が間違っていることを説明できれば幸いです。私はこれで数週間立ち往生しています。ありがとう!