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
[email protected]
https://lists.sourceforge.net/lists/listinfo/sofia-sip-devel