You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@madlib.apache.org by "Domino Valdano (JIRA)" <ji...@apache.org> on 2019/06/04 23:14:00 UTC

[jira] [Updated] (MADLIB-1355) Hide all global symbols in libmadlib.so by default

     [ https://issues.apache.org/jira/browse/MADLIB-1355?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Domino Valdano updated MADLIB-1355:
-----------------------------------
    Fix Version/s:     (was: v1.16)
                   v2.0

> Hide all global symbols in libmadlib.so by default
> --------------------------------------------------
>
>                 Key: MADLIB-1355
>                 URL: https://issues.apache.org/jira/browse/MADLIB-1355
>             Project: Apache MADlib
>          Issue Type: Task
>          Components: All Modules
>            Reporter: Domino Valdano
>            Priority: Major
>             Fix For: v2.0
>
>
> There was an intermittent crash in the deep_learning module due to both _tensorflow_ and _madlib_ using the same STL class (_std::set<string>_), and the functions in this class being publicly exported from _libmadlib.so_
>  We fixed the crash by adding the symbols for the _std::set<string>_ functions to the list of symbols the linker should hide during the build process. But we left a lot of other visible global symbols exported that shouldn't be exported... in order to be avoid extensive testing to make sure it doesn't break anything on an obscure platform or for some configurations.
> Without doing this, we will always run the risk that there is another library we are using (could be very indirect, such as with this case where python imports a module which then calls a C library) that conflicts with the version of STL or Boost that _madlib_ is using. If that happens, we could easily have another unexplained crash and it would be very difficult again to track down.
> The recommended best practice for exporting symbols from a shared object file is that we should hide everything by default, and only expose those functions which are officially a part of our API.
> We can hide everything by default by adding _-fvisibility=hidden_ to the list of default params to pass to the compiler in the master _CMakeLists.txt_. This will cause gcc to hide all symbols from external libraries by default. In addition, we should use either a #pragma or by adding a macro to prefix function definitions with that sets the visibility on specific functions we want to expose to default (visible). We can remove the _-unexported_symbols_list_ property from OSX and _--version-script_ property from other platforms, as these will no longer be needed. We should also delete the files they reference, _library.ver_ and _unexported_symbols_list.txt_
> Two good references on how to control visibility of symbols:
> [https://developer.apple.com/library/archive/technotes/tn2185/_index.html]
>  [https://gcc.gnu.org/wiki/Visibility]
> Hopefully the list of symbols we need to expose is just the list of sql functions implemented in C, but there may be a few others that also need to be exposed.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)