On 7 April 2016 at 14:53, Jean-Philippe André <[email protected]> wrote:

> Hi,
>
> On 7 April 2016 at 14:49, Jean-Philippe ANDRÉ <[email protected]> wrote:
>
>> jpeg pushed a commit to branch master.
>>
>>
>> http://git.enlightenment.org/core/efl.git/commit/?id=4e4b42ec036b1bda45879c1c4141b56106546373
>>
>> commit 4e4b42ec036b1bda45879c1c4141b56106546373
>> Author: Jean-Philippe Andre <[email protected]>
>> Date:   Thu Apr 7 14:40:10 2016 +0900
>>
>>     Efl: Add internal strong symbol to fix build on GCC < 5.3
>>
>>     This fixes a crash in ecore_init, calling a weak function from
>>     libefl that was resolved to NULL.
>>
>>     So, here's a fun thing happening with GCC < 5.3. Since a1a506e13e2
>>     all EOAPI and EO class_get() functions are weak symbols. This means
>>     that all APIs inside libefl.so are weak.
>>
>>     As a result, gcc linker with --as-needed skipped linking to libefl
>>     since not a single strong symbol from libefl was required by
>>     libecore. This is actually a bug in gcc linker since we do in fact
>>     use symbols from libefl, just weak ones.
>>
>>     GCC 5.3 seems to be fixed, so people with GCC 5.3+ will not
>>     experience any build/runtime issue. The current patch is
>>     a workaround that bug, by artifically creating a strong symbol
>>     required by ecore.
>>
>>     Other libraries than ecore might also need to call
>>     __efl_internal_init, if they end up not being linked to libefl.
>>
>
>
> This should fix the build for Ubuntu users.
>
> For more information, refer to this thread:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=32511
>

Oops, this thread:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=32219

Although it's not exactly the same situation as ours, since our weak
symbols are visible, not hidden.


>
>
>
>
>> ---
>>  src/lib/ecore/ecore.c                        | 3 +++
>>  src/lib/efl/Efl.h                            | 3 +++
>>  src/lib/efl/interfaces/efl_interfaces_main.c | 6 ++++++
>>  3 files changed, 12 insertions(+)
>>
>> diff --git a/src/lib/ecore/ecore.c b/src/lib/ecore/ecore.c
>> index d7eead3..6c326a7 100644
>> --- a/src/lib/ecore/ecore.c
>> +++ b/src/lib/ecore/ecore.c
>> @@ -210,6 +210,9 @@ ecore_init(void)
>>     if (++_ecore_init_count != 1)
>>       return _ecore_init_count;
>>
>> +   /* make sure libecore is linked to libefl - workaround gcc bug */
>> +   __efl_internal_init();
>> +
>>     setlocale(LC_CTYPE, "");
>>     /*
>>        if (strcmp(nl_langinfo(CODESET), "UTF-8"))
>> diff --git a/src/lib/efl/Efl.h b/src/lib/efl/Efl.h
>> index 2002ebc..4cc909a 100644
>> --- a/src/lib/efl/Efl.h
>> +++ b/src/lib/efl/Efl.h
>> @@ -119,6 +119,9 @@ typedef Efl_Gfx_Path_Command_Type
>> Efl_Gfx_Path_Command;
>>
>>  #endif
>>
>> +/* work-around bug in gcc --as-needed link optimization */
>> +EAPI void __efl_internal_init(void);
>> +
>>  #if defined ( __cplusplus )
>>  }
>>  #endif
>> diff --git a/src/lib/efl/interfaces/efl_interfaces_main.c
>> b/src/lib/efl/interfaces/efl_interfaces_main.c
>> index 908e228..68ff6f3 100644
>> --- a/src/lib/efl/interfaces/efl_interfaces_main.c
>> +++ b/src/lib/efl/interfaces/efl_interfaces_main.c
>> @@ -37,3 +37,9 @@ EAPI const Eo_Event_Description _EFL_GFX_PATH_CHANGED =
>>  #include "interfaces/efl_animator.eo.c"
>>  #include "interfaces/efl_orientation.eo.c"
>>  #include "interfaces/efl_flip.eo.c"
>> +
>> +EAPI void
>> +__efl_internal_init(void)
>> +{
>> +   /* nothing to do, the symbol only is required for link to work */
>> +}
>>
>> --
>>
>>
>>
>
>
> --
> Jean-Philippe André
>



-- 
Jean-Philippe André
------------------------------------------------------------------------------
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to