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
