__floatsidf
は、32ビット符号付き整数を倍精度浮動小数点数に変換するランタイムルーチンです。 bar
は、32ビットの整数である同様の
double foo = bar;
か何か、:プロジェクト内のどこかには、次のような行です。また、(実際に、または他の関数)あなたはlibm
関数のいずれかを呼び出していることになる整数パラメータでdouble
を期待していることができます
foo = pow(bar, baz);
bar
またはbaz
(あるいはその両方)のいずれかの整数であり、 。
いくつかのコードを表示せずに、私たちが手助けすることはそれほど多くありません。
は、オブジェクトが(あなたがそれらをリンクする前に)あなたのコンパイラが生成するファイルをチェックし、それを絞り込むと、そのシンボルを参照するために解体して探すには - それはで起こっている機能何を伝えるべきである
ここ
です。私が意味するものの例。最初のソースコード:
#include <math.h>
int function(int x, int y)
{
return pow(x, y);
}
かなり簡単ですか?今、私はARMのためにそれをコンパイルし、逆アセンブルするつもりです。その時
$ clang -arch arm -O2 -c -o example.o example.c
$ otool -tV example.o
example.o:
(__TEXT,__text) section
_function:
00000000 e92d40f0 push {r4, r5, r6, r7, lr}
00000004 e28d700c add r7, sp, #12
00000008 e1a04001 mov r4, r1
0000000c ebfffffb bl ___floatsidf
00000010 e1a05000 mov r5, r0
00000014 e1a00004 mov r0, r4
00000018 e1a06001 mov r6, r1
0000001c ebfffff7 bl ___floatsidf
00000020 e1a02000 mov r2, r0
00000024 e1a03001 mov r3, r1
00000028 e1a00005 mov r0, r5
0000002c e1a01006 mov r1, r6
00000030 ebfffff2 bl _pow
00000034 ebfffff1 bl ___fixdfsi
00000038 e8bd40f0 pop {r4, r5, r6, r7, lr}
0000003c e12fff1e bx lr
ルック - 2つのdouble
にx
とy
の2つの変換を一致__fixdfsi
から__floatsidf
と1の呼び出し、その後の変換を戻り値の型はint
に戻ります。
あなたは '__floatsidf'シンボルへの参照を含むものを含めていますか? –
どちらの答えもこれになります。カーネルで浮動小数点を使用しないでください。 – ugoren