Thank you for your reply, I will test your suggestion tomorrow.
test_nua.exe passed correctly with that darcs branch:
http://people.collabora.co.uk/~alban/darcs/sofia-sip-alban-linkage/
(for viewing patchs:
http://monkey.collabora.co.uk/sofia-sip-alban-linkage/ )
The first patch fixs the bug in mmp files, and the second is a
hack to avoid the problem (not to be merged!).
--
Alban
Le Tue, 26 Feb 2008 20:56:32 +0200,
"Pekka Pessi" <[EMAIL PROTECTED]> a écrit :
> 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).
>
-------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/sofia-sip-devel