Description
You can download testcase files here:
https://github.com/open-mpi/ompi-tests-public/blob/master/packaging/run_nmcheck.c
https://github.com/open-mpi/ompi-tests-public/blob/master/packaging/nmcheck_prefix.pl
With those in place and a build of OMPI available, running the test is just:
#!/bin/sh
export OPAL_PREFIX=/path/to/some/ompi_install
export LD_LIBRARY_PATH=${OPAL_PREFIX}/lib
$OPAL_PREFIX/bin/mpicc -o x run_nmcheck.c
$OPAL_PREFIX/bin/mpirun -np 1 ./x
And a big list of questionable global exports should get listed.
Or a lighter weight way to get similar output is simply
nm ompi_install/lib/libmpi.so | grep ' [TWBCDVR] ' | grep -v -e ' MPI_' -e ' mpi_' -e ' PMPI_' -e ' MPIX_' -e ' MPL_' -e ' ADIOI_' -e ' ADIO_' -e ' ompi_' -e ' OMPI_' -e ' mca_' | less
although I recommend the ompi-tests-public testcase since it checks more libraries and has a longer list of global exports it allows as "acceptable" prefixes. Those prefixes are a somewhat arbitrary decision based on pragmatism -- eg what symbol names are likely to collide with symbols from a user's application or possibly their other support libraries.
When I run the test on branch v5.0.x
I get
*** checking /u/markalle/space/Projects/OMPIDev.symbol/install/lib/libopen-pal.so.0
[error] common_sm_mpool_create
[error] selected_component
[error] shmem_posix_shm_open
[error] wait_sync_global_wakeup_mt
[error] wait_sync_global_wakeup_st
[error] wait_sync_list
*** checking /u/markalle/space/Projects/OMPIDev.symbol/install/lib/libpmix.so.0
[error] file_caddy_t_class
[error] file_tracker_t_class
[error] heartbeat_caddy_t_class
*** checking /u/markalle/space/Projects/OMPIDev.symbol/install/lib/libmpi.so.0
[error] _dict_free
[error] _dict_malloc
[error] ad_get_env_vars
[error] adapt_module_cached_topology
[error] adapt_topology_cache_item_t_class
[error] add_edge_3
[error] add_to_bucket
[error] add_to_list
[error] adjacency_asc
[error] adjacency_dsc
[error] aggregate_obj_weight
[error] algo
[error] allocate_vertex
[error] allocate_vertex2
[error] append_frag_to_ordered_list
[error] available_components
[error] balancing
[error] bottom_up_build_tree_from_topology
[error] bucket_grouping
[error] bucket_id
[error] build_cost_matrix
[error] build_level_topology
[error] build_p_vector
[error] build_synthetic_proc_id
[error] built_pivot_tree
[error] check_bucket
[error] check_cantmatch_for_match
[error] check_constraints
[error] choose
[error] clone_tree
[error] common_monitoring_translation_ht
[error] complete_aff_mat
[error] complete_obj_weight
[error] complete_tab_node
[error] compute_gain
[error] compute_nb_leaves_from_level
[error] compute_weighted_degree
[error] create_dumb_tree
[error] create_work
[error] delete_group_list
[error] depth_first
[error] destroy_work
[error] destruction
[error] dfs
[error] dict_destroy
[error] dict_int_cmp
[error] dict_itor_destroy
[error] dict_long_cmp
[error] dict_ptr_cmp
[error] dict_set_free
[error] dict_set_malloc
[error] dict_str_cmp
[error] dict_uint_cmp
[error] dict_ulong_cmp
[error] display_bucket
[error] display_bucket_list
[error] display_grouping
[error] display_node
[error] display_pivots
[error] display_selection
[error] display_sol
[error] display_sol_sum_com
[error] display_tab
[error] display_tab_group
[error] distance
[error] era_agreement_info_t_class
[error] era_comm_agreement_specific_t_class
[error] era_iagree_request_t_class
[error] era_rank_item_t_class
[error] era_value_t_class
[error] eval_cost
[error] eval_cost2
[error] eval_grouping
[error] eval_sol
[error] exchange
[error] fast_group
[error] fast_grouping
[error] fbtl_posix_max_aio_active_reqs
[error] fiboTreeConsolidate
[error] fiboTreeDel
[error] fiboTreeExit
[error] fiboTreeFree
[error] fiboTreeInit
[error] fiboTreeMin
[error] file_stats
...
[error] zero_dte_mapping
*** checking /u/markalle/space/Projects/OMPIDev.symbol/install/lib/libmpi_mpifh.so
*** checking /u/markalle/space/Projects/OMPIDev.symbol/install/lib/libmpi_usempif08.so
*** checking /u/markalle/space/Projects/OMPIDev.symbol/install/lib/libmpi_usempi_ignore_tkr.so
Note, when it comes to fixing them sometimes you can make things static, but often the symbols will span multiple files so in that case a prefix can be added to the symbol. Also when symbols like adapt_topology_cache_item_t_class
show up (things that end with _class) that means there's a line like
OBJ_CLASS_INSTANCE(adapt_topology_cache_item_t, ...)
and the occurrances of adapt_topology_cache_item_t
need updated. Eg I'm just noting that you can't search the code for adapt_topology_cache_item_t_class
, you have to just search for adapt_topology_cache_item_t
to find the cause of the adapt_topology_cache_item_t_class
export.