[ 
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)

Reply via email to