On Fri, Jan 27, 2012 at 5:34 AM, Jeff Squyres <jsquyres@cisco.com> wrote:
[snip] 

I'm not quite sure how that can happen -- orte_odls appears to be prototyped properly in orte/mca/odls/odls.h (i.e., it has ORTE_DECLSPEC, for visibility), and is properly instantiated in orte/mca/odls/base/odls_base_open.c.

Paul: can you run some nm's and see how the orte_odls symbol appears in libopen-rte.a?



In the PGI build directory:
$ find . -name '*.a' | while read lib; do
      out=`nm $lib 2>/dev/null | grep -w _orte_odls`;
      test -n "$out" && echo -e "${lib}:\n${out}";
   done
./orte/.libs/libopen-rte.a:
                 U _orte_odls
                 U _orte_odls
                 U _orte_odls
0000000000000038 C _orte_odls
                 U _orte_odls
                 U _orte_odls
./orte/mca/errmgr/.libs/libmca_errmgr.a:
                 U _orte_odls
./orte/mca/odls/.libs/libmca_odls.a:
0000000000000038 C _orte_odls
                 U _orte_odls
./orte/mca/plm/.libs/libmca_plm.a:
                 U _orte_odls

Meanwhile in the GCC build directory the same shell command yields something quite different:
./orte/mca/errmgr/.libs/libmca_errmgr.a:
                 U _orte_odls
./orte/mca/odls/.libs/libmca_odls.a:
00000000000011c0 S _orte_odls
                 U _orte_odls
./orte/mca/plm/.libs/libmca_plm.a:
                 U _orte_odls

So the difference boils down to "C" vs "S".
According to "man nm" on this system
  "C" is "common" 
  "S" is "other section not listed above"

I don't know much about visibility attributes and so can't follow the path any further without some instructions to follow.  (Though I will read the PGI manpages for anything related to common vs noncommon symbols).

Hopefully those are the droids you're looking for,
-Paul

--
Paul H. Hargrove                          PHHargrove@lbl.gov
Future Technologies Group
HPC Research Department                   Tel: +1-510-495-2352
Lawrence Berkeley National Laboratory     Fax: +1-510-486-6900