2008/2/26, Alban Crequy <[EMAIL PROTECTED]>:
>  > I think the static variable is initialized before the DLL linkage is
>  > complete.
>
> It makes sense.  Do you think this problem occurs only on the simulator,
>  or also on the device ?  (I only tested the simulator.)

I have no idea, but I think the DLL linking code is same on both. I
recall that Martti had to fix similar stuff within Sofia SIP DLL
(initializing pthread_mutex_t structs, if I recall correctly).

>  > The additional complication is that Sofia SIP DLL exports
>  > an array or struct but Symbian (and Windows) DLL linkage does not
>  > support them, it supports just pointers. The __declspec() magic is
>  > implemented badly in the Symbian compilers (not to speak about
>  > Windows), so they may end up of using the pointer to the pointer to
>  > the array/struct where they should just use pointer to the
>  > array/struct.

> I don't understand this additional complication.  Do you have a link
>  explaining this limitation on pointers and structures ?  I don't think
>  this complication happened in my tests until now.

Basically, we say we export

__declspec(export) int array[3];

and application says it imports

__declspec(import) int array[3];

What the application actually gets, is a variable of type

int (*_array)[3];

which is for most purposes identical to

int **_array;

When we initialize a variable with value of array with definition like

int *pointer = array;

the Symbian/Windows linker can not initialize the data segment
correctly, but the C runtime should call some generated code that
fetches the value from *array and stores it to the variable. I suspect
that the runtime fails to do so, or does it in incorrect order, or the
C compiler simply does not generate necessary code (as it is not
needed on Unix systems).

>  > It seems to me that Martti just avoids static initialization with
>  > pointers from DLL.

> Do you mean in other programs using the sofia-sip DLLs ?  The test
>  programs seems to use static initialization.

I failed to find one with quick grep. I meant something like

static tagi_t tags[] = {{ NUTAG_ANY() } ... };

but now understand that you meant that also this

tagi_t tags[] = {{ NUTAG_ANY() } ... };

breaks on Symbian.

>  > >  But this pattern is used a lot in sofia-sip. I don't know whether
>  > >  changing this pattern is the right thing to do. Maybe it is a bug
>  > > in the compiler, epoc, or whatever and we should fix the real bug
>  > > instead. (?)
>  > >
>  > >  For example, see:
>  > >  ./libsofia-sip-ua/nua/test_nua_params.c line 59 that uses
>  > > NUTAG_ANY, which is a macro expanding to symbol nutag_any from the
>  > > dll.
>  >
>  > I think this particular example should work without problems
>  > (assuming, of course, that you have fixed the IN_LIBSOFIA_SIP_UA).

> I have run a binary search to find symbols that break the linkage (e.g.
>  symbols that are used with the problematic pattern).  In addition to
>  macros SOFIAPUBVAR/SOFIAPUBFUN that extends to the wrong __declspec(),
>  I added my own macros that extends to the right __declspec().  I did
>  not just fix the macro because it would be difficult to find every
>  occurance of the problematic pattern in one step.  So I can replace
>  each problematic pattern with the pattern that works, step by step (as
>  I have done in the example [1]).
>
>  And when I use __declspec() correctly on nutag_any, it crashs unless I
>  also use the following patch:
>
>  ----->8-----------
>  sofia-sip-1.12.8/libsofia-sip-ua/nua/test_nua_params.c
>  @@ -56,10 +56,14 @@
>    tag_typedef_t tag_b = STRTAG_TYPEDEF(b);
>   #define TAG_B(s)      tag_b, tag_str_v((s))
>
>  -  tagi_t filter[2] = {{ NUTAG_ANY() }, { TAG_END() }};
>  +  tagi_t filter[2] = {{ TAG_END() }, { TAG_END() }};
>
>    tagi_t *lst, *result;
>
>  +  filter[0].t_tag = nutag_any;
>  +  filter[0].t_value = (tag_value_t)0;
>  +
>    lst = tl_list(TAG_A("X"),
>                 TAG_SKIP(2),
>                 NUTAG_URL((void *)"urn:foo"),
>  ----->8-----------
>
>  The patch is a hack, but show that when nutag_any is used to initialize
>  a variable before the DLL linkage is complete, it crashs.

>  So far, I also changed the variables _proxy_challenger and
>  _registrar_challenger from ./libsofia-sip-ua/nua/test_proxy.c with a
>  similar patch than above.
>
>
>  > Or
>  > then the __declspec() magic breaks in even worse way on Symbian than
>  > on Windows.
>
>
> I don't think the problem on nutag_any is worse than the problem in
>  [1]. I think it is the same problem.
>
>  [1] http://discussion.forum.nokia.com/forum/showthread.php?t=127457

You are probably correct.

>  Any suggestions to fix the problem ?

Check that you are linking correct runtime for your compiler.

Could you generate asm with your GCC from a C file with function using
non-zero array initializer like

#include <sofia-sip/su_tag.h>

tagi_t *tester(void)
{
tagi_t filter[2] = {{ NUTAG_ANY() }, { TAG_END() }};
return tl_adup(NULL, filter);
}

and post it? I wonder if the generated code does memcpy from data
segment, for instance, or  initializes the array explicitly, and if
there is some extra code that initializes the data segment in
C++-manner, and if so, how it is supposed to be called (you might need
to call such code explicitly).

-- 
Pekka.Pessi mail at nokia.com

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Sofia-sip-devel mailing list
Sofia-sip-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sofia-sip-devel

Reply via email to