2016-12-08 9 views
5

मैं सांबा 3.6.25 का उपयोग कर एक प्रोजेक्ट काम कर रहा हूं। जब मैं की "smbclient" मेरे अपने एसएमबी सर्वर लिस्टिंग उपयोगिता बनाने की कोशिश स्रोत कोड का पालन करें, मैं एक अजीब बात यह है कि मुलाकात:सी समारोह पैरामीटर रहस्यमय ढंग से बहाव?

जब मैं एक समारोह आह्वान, यह मेरी पहली पैरामीटर को छोड़ दिया और दूसरा एक साथ यह बजाय भरने, और फिर दूसरा तीसरा, जैसा कि।

समारोह मैं आह्वान है: 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; 
    } 
…… 

और यह कैसे मैं इस समारोह फोन है:

--- 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 

यह नहीं था:

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); 
} 

यहाँ है कि मैं क्या कंसोल में मिलता है सही बात! देखा कि चार मापदंडों मैं पारित कर दिया हैं: 0xdb2b20, 0x1, 0xda31c0, 0x7fe9fdc8 लेकिन क्या cli_rpc_pipe_open_noauth_transport() मिला था: 0x1, 0xda31c0, 0x7fe9fdc8, 0xdaf3d0

यह काफी स्पष्ट था कि पहले पैरामीटर "0xdb2b20 "गायब था, और दूसरा व्यक्ति अपनी जगह ले लिया था।

क्या किसी को पता है कि क्या हो रहा था और मैं इसे कैसे ठीक कर सकता हूं?

अग्रिम में बहुत बहुत धन्यवाद!

--- अतिरिक्त जानकारी:

toolchain मैं उपयोग कर रहा था mipsel-linux-uclibc-सीसी/ld/ar था। मैंने क्या चल रहा था यह देखने के लिए कई लक्ष्य फ़ाइलों को objdump करने की कोशिश की।

मैंने अपना खुद का कार्यक्रम छोड़ दिया, यहां समारोहों का आह्वान करने वाले असेंबली हैं। देखा कि चार मापदंडों अनुक्रम में पारित कर दिया गया: 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 

तब मैं smbclient है, जो भी cli_rpc_pipe_open_noauth_transport लागू() फेंक दिया। यहां समस्या आई: ऐसा प्रतीत होता था कि 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. मैं डाउनलोड आधिकारिक एफ़टीपी सर्वर से डी सांबा।
  2. कॉन्फ़िगर करें और इसे बनाएं (क्रॉस-कंपाइल)
  3. "स्रोत 3" निर्देशिका में सभी .o फ़ाइल खोजें, और फिर उन्हें एक ही .a फ़ाइल में एक साथ संग्रहित करें।
  4. अपना स्वयं का एप्लिकेशन बनाएं, सांबा फ़ंक्शन को अपने स्वयं के प्रोग्राम "smbclient" की तरह कॉल करें, कई विकल्पों के साथ, जो संकलन कार्य सुनिश्चित करता है
  5. लिंक libsmbclient.a लिंक करें जो सांबा आधिकारिक रूप से प्रदान किया गया है, और मेरा स्वयं का संग्रह .a में चरण 3.

अतिरिक्त जानकारी .3

इस भंडार का पूरा स्रोत: https://github.com/Andrew-M-C/SMB-CIFS_discovery

+0

निश्चित रूप से एक कंपाइलर बग की तरह दिखता है। यदि आप परीक्षण मामले को कम करते हैं तो क्या त्रुटि गायब हो जाती है? जो भी टूलचैन बनाया गया है उसके साथ एक बग उठाकर शायद अगला कदम है। जब तक आप gcc के माध्यम से ट्रेसिंग के लिए तैयार नहीं होते हैं :) –

+0

फ़ंक्शन कॉल से पहले स्टैक दिखाने के लिए आपको अपने _DEBUG को cli_rpc_pipe_open() से ऊपर रखना चाहिए। – Holger

+0

@ होल्गर मैंने _DEBUG को cli_rpc_pipe_open() से ऊपर रखा था, और फ़ंक्शन ने वही त्रुटि की थी। मैंने इसे पैरामीटर को पास करने के लिए बस मुझे आसान बनाने के लिए रखा है (अन्यथा, कई भ्रमित "जेलर" निर्देश होंगे) –

उत्तर

0

यहां प्रश्नकर्ता से उत्तर:

मैंने इसे हल किया। असल में मैंने समस्या को हल नहीं किया है, लेकिन मेरे लक्ष्य को हासिल करने के लिए एक और तरीका कोशिश की।

मैंने अपनी परियोजना का पुराना तरीका बनाया है: सबसे पहले सांबा का निर्माण करें, फिर सांबा ऑब्जेक्ट और सांबा रिपोजिटरी के बाहर स्थिर लाइब्रेरी फ़ाइलों को लिंक करें। यह तब था जब मैं समस्या से मुलाकात की।

मैंने जिस तरह से बनाया है उसे बदल दिया है: सबसे पहले मूल सांबा "smbclient" कोड को अपने स्वयं के साथ ओवरराइड करें, फिर सांबा बनाएं। सांबा मेकफ़ाइल मेरी स्रोत फ़ाइल को smbclient स्रोत फ़ाइल के रूप में पहचानती है और आसानी से संकलित और उन्हें लिंक करती है। अंत में, यह काम किया।

कृपया प्रश्न में उल्लिखित गिटहब भंडार का संदर्भ लें।

+0

अपना उत्तर स्वीकार करने के लिए मत भूलना। –

संबंधित मुद्दे