www.digitalmars.com         C & C++   DMDScript  

D - Compiling without -g

reply "Julio CÚsar Carrascal Urquijo" <adnoctum phreaker.net> writes:
Finally got time to look at the problem with embeding the PHP interpreter in
D.


Again, the program runs just fine when compiled with -g but raises an
AccessViolation error on the php_embed_init() call. Here's the source code.

const int SUCCESS = 0;

extern (C)
{
    int php_embed_init(int argc, char** argv , void**** ptsrm_ls);
    void php_embed_shutdown(void*** tsrm_ls);

    export char* get_zend_version();
}


int main()
{
    static char *argv[2] = ["test1", null];
    static void*** tsrm_ls = null;

    if (SUCCESS != php_embed_init(1, argv, &tsrm_ls))
    {
        printf("Failed initializing php_embed sapi\n");
        return -1;
    }

    printf("Zend version: %s\n", get_zend_version());

    php_embed_shutdown(tsrm_ls);
    return 0;
}

Following the advice from Walter, I've disassembled the files but given my
poor skills in ASM I've lost track just from the start so I ask for help
now.

The main function got translated to:

Comdat: __Dmain SEGMENT NONE '_TEXT' 00000052 bytes
0000    55                        push      ebp
0001    8B EC                     mov       ebp,esp
0003    68 04 00 00 00            push      offset L$8
0008    68 08 00 00 00            push      offset L$2
000D    6A 01                     push      0x00000001
000F    E8 00 00 00 00            call      _php_embed_init
0014    83 C4 0C                  add       esp,0x0000000c
0017    85 C0                     test      eax,eax
0019    74 14                     je        L$9
001B    68 10 00 00 00            push      offset L$3
0020    E8 00 00 00 00            call      _printf
0025    B8 FF FF FF FF            mov       eax,0xffffffff
002A    83 C4 04                  add       esp,0x00000004
002D    5D                        pop       ebp
002E    C3                        ret


That's the debug version. The optimized one doesn't have the following lines

0000    55                        push      ebp
0001    8B EC                     mov       ebp,esp
(...)
002D    5D                        pop       ebp

So that must be the reason. Only that I don't know why, saving ebp on the
stack prevents an access violation from raising.

Mmmm... Help!


--
Julio CÚsar Carrascal Urquijo
http://www.artelogico.com/
Nov 26 2003
parent reply "Walter" <walter digitalmars.com> writes:
Are you using linux?

"Julio CÚsar Carrascal Urquijo" <adnoctum phreaker.net> wrote in message
news:bq3sm3$2992$1 digitaldaemon.com...
 Finally got time to look at the problem with embeding the PHP interpreter

 D.


 Again, the program runs just fine when compiled with -g but raises an
 AccessViolation error on the php_embed_init() call. Here's the source

 const int SUCCESS = 0;

 extern (C)
 {
     int php_embed_init(int argc, char** argv , void**** ptsrm_ls);
     void php_embed_shutdown(void*** tsrm_ls);

     export char* get_zend_version();
 }


 int main()
 {
     static char *argv[2] = ["test1", null];
     static void*** tsrm_ls = null;

     if (SUCCESS != php_embed_init(1, argv, &tsrm_ls))
     {
         printf("Failed initializing php_embed sapi\n");
         return -1;
     }

     printf("Zend version: %s\n", get_zend_version());

     php_embed_shutdown(tsrm_ls);
     return 0;
 }

 Following the advice from Walter, I've disassembled the files but given my
 poor skills in ASM I've lost track just from the start so I ask for help
 now.

 The main function got translated to:

 Comdat: __Dmain SEGMENT NONE '_TEXT' 00000052 bytes
 0000    55                        push      ebp
 0001    8B EC                     mov       ebp,esp
 0003    68 04 00 00 00            push      offset L$8
 0008    68 08 00 00 00            push      offset L$2
 000D    6A 01                     push      0x00000001
 000F    E8 00 00 00 00            call      _php_embed_init
 0014    83 C4 0C                  add       esp,0x0000000c
 0017    85 C0                     test      eax,eax
 0019    74 14                     je        L$9
 001B    68 10 00 00 00            push      offset L$3
 0020    E8 00 00 00 00            call      _printf
 0025    B8 FF FF FF FF            mov       eax,0xffffffff
 002A    83 C4 04                  add       esp,0x00000004
 002D    5D                        pop       ebp
 002E    C3                        ret


 That's the debug version. The optimized one doesn't have the following

 0000    55                        push      ebp
 0001    8B EC                     mov       ebp,esp
 (...)
 002D    5D                        pop       ebp

 So that must be the reason. Only that I don't know why, saving ebp on the
 stack prevents an access violation from raising.

 Mmmm... Help!


 --
 Julio CÚsar Carrascal Urquijo
 http://www.artelogico.com/

Nov 28 2003
parent reply "Julio CÚsar Carrascal Urquijo" <adnoctum phreaker.net> writes:
Tested on win98se and Win2k dmd 0.75 php-4.3.3 libs.

If you want to compile the example I'll send you the OMF libs. Didn't posted
to the ng because their +600k.


"Walter" <walter digitalmars.com> wrote in message
news:bq897i$2s6v$2 digitaldaemon.com...
 Are you using linux?

-- Julio CÚsar Carrascal Urquijo http://www.artelogico.com/
Nov 28 2003
parent "Walter" <walter digitalmars.com> writes:
"Julio CÚsar Carrascal Urquijo" <adnoctum phreaker.net> wrote in message
news:bq8vrj$qog$1 digitaldaemon.com...
 Tested on win98se and Win2k dmd 0.75 php-4.3.3 libs.

 If you want to compile the example I'll send you the OMF libs. Didn't

 to the ng because their +600k.

It's just not practical for me to debug 600k of code I'm not familiar with. I really need small, reproducible examples of problems.
Dec 29 2003