2016-12-08 9 views
5

私はSamba 3.6.25を使ってプロジェクトを進めています。 "smbclient"のソースコードに従って自分のSMBサーバーリストユーティリティをビルドしようとしたときに、私は奇妙なことに出会った:C関数のパラメータが不思議に漂っていますか?

私は関数を呼び出すときに、最初のパラメータをスキップして、次に2番目の3番目のように。

Iが呼び出す関数である:cli_rpc_pipe_open_noauth_transport()でcli_pipe.c

NTSTATUS cli_rpc_pipe_open_noauth_transport(struct cli_state *cli, 
         enum dcerpc_transport_t transport, 
         const struct ndr_syntax_id *interface, 
         struct rpc_pipe_client **presult) 
{ 

    struct rpc_pipe_client *result; 
    struct pipe_auth_data *auth; 
    NTSTATUS status; 

    status = cli_rpc_pipe_open(cli, transport, interface, &result); 
    _DEBUG("cli = %p", cli); 
    _DEBUG("transport = %p", transport); 
    _DEBUG("interface = %p", interface); 
    _DEBUG("presult = %p", presult); 
    _DEBUG("cli->desthost = %p", cli->desthost); 
    _DEBUG("cli->desthost = \"%s\"", cli->desthost); 
    if (!NT_STATUS_IS_OK(status)) { 
     return status; 
    } 
…… 

をそして、これは私がこの関数を呼び出す方法です:私はそれにいくつかのデバッグコードを追加しました。ここ

NTSTATUS _pipe_open_noauth(struct cli_state *cli, const struct ndr_syntax_id *intf, struct rpc_pipe_client **presult) 
{ 
    SMBD_DEBUG("cli = %p", cli); 
    SMBD_DEBUG("intf = %p", intf); 
    SMBD_DEBUG("presult = %p", presult); 
    SMBD_DEBUG("cli->desthost = %p", cli->desthost); 
    SMBD_DEBUG("cli->desthost = \"%s\"", cli->desthost); 
    return cli_rpc_pipe_open_noauth_transport(cli, 1, intf, presult); 
} 

は、私は、コンソールで得るものです:

--- SMBD (util_smbclient.c, 117): cli = 0xdb2b20 
--- SMBD (util_smbclient.c, 118): intf = 0xda31c0 
--- SMBD (util_smbclient.c, 119): presult = 0x7fe9fdc8 
--- SMBD (util_smbclient.c, 120): cli->desthost = 0xdd3a50 
--- SMBD (util_smbclient.c, 121): cli->desthost = "192.168.1.125" 
=== Samba (rpc_client/cli_pipe.c, 2873): cli = 0x1 
=== Samba (rpc_client/cli_pipe.c, 2874): transport = 0xda31c0 
=== Samba (rpc_client/cli_pipe.c, 2875): interface = 0x7fe9fdc8 
=== Samba (rpc_client/cli_pipe.c, 2876): presult = 0xdaf3d0 

それはしませんでした理にかなって!私は渡された4つのパラメータはある気付いたこと: 0xdb2b20、0x1の、0xda31c0、0x7fe9fdc8 しかし、何cli_rpc_pipe_open_noauth_transport()が持っていた: 0x1の、0xda31c0、0x7fe9fdc8、0xdaf3d0

は、それは非常に明白だったその最初のパラメータ「0xdb2b20 "行方不明で、第二の行為はその場所を取った。

何が起こっていたのか、どのように修正できますか?

ありがとうございます!

--- 追加情報:私が使っていた

ツールチェーンははmipsel-linuxの-uClibcを-CC/LD/ARでした。私は何が起こっていたかを見るためにいくつかのターゲットファイルをobjdumpしようとしました。

私は自分のプログラムをダンプしました。ここでは、その関数を呼び出すアセンブリがあります。 は、4つのパラメータは配列で渡されたことを気づい:A0、A1、A2、A3:

409bf0: 8fdc0010 lw gp,16(s8) 
    409bf4: 8fc40020 lw a0,32(s8) 
    409bf8: 24050001 li a1,1   # store “1” in a1 
    409bfc: 8fc60024 lw a2,36(s8) 
    409c00: 8fc70028 lw a3,40(s8) 
    409c04: 8f99ab74 lw t9,-21644(gp) 
    409c08: 00000000 nop 
    409c0c: 0320f809 jalr t9 
    409c10: 00000000 nop 
    409c14: 8fdc0010 lw gp,16(s8) 
    409c18: 03c0e821 move sp,s8 
    409c1c: 8fbf001c lw ra,28(sp) 
    409c20: 8fbe0018 lw s8,24(sp) 
    409c24: 03e00008 jr ra 
    409c28: 27bd0020 addiu sp,sp,32 

そしてIはまたcli_rpc_pipe_open_noauth_transport()呼び出され、smbclientのをダンプ。 ここで問題が発生しました。a0はパラメータを渡すのに使用されていないようでした。

<cli_rpc_pipe_open_noauth>: 
       … 
    487840: 8fdc0018 lw gp,24(s8) 
    487844: 8fc2003c lw v0,60(s8) 
    487848: 00000000 nop 
    48784c: afa20010 sw v0,16(sp) 
    487850: 02002021 move a0,s0 
    487854: 8fc50034 lw a1,52(s8) 
    487858: 24060001 li a2,1 # Here, the number “1” was stored in a2 instead of a1!!! 
    48785c: 8fc70038 lw a3,56(s8) 
    487860: 8f99aed0 lw t9,-20784(gp) 
    487864: 00000000 nop 
    487868: 0320f809 jalr t9 # cli_rpc_pipe_open_noauth_transport() 
    48786c: 00000000 nop 
    487870: 8fdc0018 lw gp,24(s8) 
    487874: 02001021 move v0,s0 
    487878: 03c0e821 move sp,s8 
    48787c: 8fbf0028 lw ra,40(sp) 
    487880: 8fbe0024 lw s8,36(sp) 
    487884: 8fb00020 lw s0,32(sp) 
    487888: 03e00008 jr ra 
    48788c: 27bd0030 addiu sp,sp,48 

最後に、私は(cli_rpc_pipe_open_noauth_transportをダンプ)自体が、それはsmbclientのが行った方法で働いていたことが表示されます:

0053bdac <cli_rpc_pipe_open_noauth_transport>: 
    53bdac: 3c1c0087 lui gp,0x87 
    53bdb0: 279c3624 addiu gp,gp,13860 
    53bdb4: 0399e021 addu gp,gp,t9 
    53bdb8: 27bdffc0 addiu sp,sp,-64 
    53bdbc: afbf0038 sw ra,56(sp) 
    53bdc0: afbe0034 sw s8,52(sp) 
    53bdc4: afb00030 sw s0,48(sp) 
    53bdc8: 03a0f021 move s8,sp 
    53bdcc: afbc0018 sw gp,24(sp) 
    53bdd0: afc40040 sw a0,64(s8) 
    53bdd4: afc50044 sw a1,68(s8) 
    53bdd8: afc60048 sw a2,72(s8) 
    53bddc: afc7004c sw a3,76(s8) 
    53bde0: 8f848080 lw a0,-32640(gp) 
    53bde4: 00000000 nop 
    53bde8: 24844da0 addiu a0,a0,19872 
    53bdec: 24050b39 li a1,2873 
    53bdf0: 8fc60044 lw a2,68(s8) 
    53bdf4: 8f99cab0 lw t9,-13648(gp) 
    53bdf8: 00000000 nop 
    53bdfc: 0320f809 jalr t9    <—— invoke cli_rpc_pipe_open() 
    53be00: 00000000 nop 

を追加情報第2号 - 私は私をコンパイルする方法プログラム

  1. I downdade d公式FTPサーバからのSamba。
  2. "source3"ディレクトリ内のすべての.oファイルを見つけて、すべてを1つの.aファイルにまとめてアーカイブします。
  3. は、自分のアプリケーションを作成し、コンパイルが
  4. リンクSambaが正式に提供libsmbclient.a、そして私自身のアーカイブ.A内を動作することを確認、多くの-Iオプションで、主に独自のプログラム「smbclientの」ないようにSambaの関数を呼び出しますステップ3

追加情報第3番

このリポジトリの完全なソース: https://github.com/Andrew-M-C/SMB-CIFS_discovery

+0

確かにコンパイラのバグのようです。テストケースを減らすと、エラーは消えますか?おそらく、ツールチェーンを構築した人とバグを起こすことは次のステップです。 gccでトレースしない限り:) –

+0

関数呼び出しの前にスタックを表示するには、_DEBUGをcli_rpc_pipe_open()の上に置く必要があります。 – Holger

+0

@Holger私はcli_rpc_pipe_open()の上に_DEBUGを置いていましたが、関数は同じエラーを出しました。私はパラメータの受け渡しを簡単にするためにそれを置いています(そうでなければ、多くの混乱する "jalr"命令があります) –

答えて

0

質問者からの回答:

私はそれを解決しました。実際に私は問題自体を解決していないが、私の目標を達成する別の方法を試みた。

私がプロジェクトをビルドしたのは、まずSambaをビルドし、次にSambaオブジェクトと静的ライブラリファイルをSambaリポジトリの外部にリンクします。これは私が問題に会った時でした。

私が構築した方法を変更しました:最初に元のSamba "smbclient"コードを私自身のものに置き換えてから、Sambaをビルドします。 Samba Makefileは自分のソースファイルをsmbclientソースファイルとして認識し、スムーズにコンパイルしてリンクします。最後に、それは働いた。

質問に記載されているGitHubリポジトリを参照してください。

+0

あなたの答えを受け入れることを忘れないでください。 –

関連する問題