After spending few hours reading through some pretty good papers about
shared libraries, I came to the conclusion that somehow this whole
stuff is even more obfuscated that one might think. If I understand
correctly, there is no need for all local symbols to be visible at
all. The linker is allowed to optimize them out. However, it turned
out that at least [today] in practice the local symbols are visible
(with several versions of gcc, icc and vc).
In other words, we can safely remove the _DECLSPEC for all debugging
symbols and today this will work. However, if we want to avoid having
issues with them in the future (when the compiler and linked will be
much much much more smarter) I think it's wiser to keep them there.
On Sep 30, 2009, at 06:01 , Jeff Squyres wrote:
> I still don't think these need to be DECLSPEC. Debuggers can find
> local symbols (including static symbols). Sun was having a problem
> with the Intel compilers because the function was being inlined --
> and therefore the symbol didn't exist at all.
> Removing the "static" was a simple optimization to force the intel
> compiler to *not* inline the function. That's all.
> We should *not* be exposing the MPIR_Breakpoint function to user
> applications who -lmpi. That is what putting DECLSPEC there will do.
> I believe that the DECLSPEC should be removed.
> On Sep 30, 2009, at 12:08 AM, George Bosilca wrote:
>> Ethan is right. The MPIR_Breakpoint function will be queried by your
>> preferred parallel debugger, in order to set a breakpoint. Therefore,
>> to allow the debuggers to be able to find the function we have to
>> sure it is externally visible, i.e. flagged with OMPI_DECLSPEC (for
>> the one in libmpi) and with ORTE_DECLSPEC for the one in libopen-rte.
>> And yes, we really need the *_DECLSPEC to make it visible, extern is
>> not enough.
>> Moreover, looking in the ompi/debugger/debugger.h file I realized
>> the two functions declared inside are flagged OMPI_DECLSPEC when they
>> should not have been, as these two functions are not called from
>> outside the libmpi.
>> Please try r22032.
>> On Sep 29, 2009, at 17:55 , Jeff Squyres wrote:
>> > On Sep 29, 2009, at 5:30 PM, Ralph Castain wrote:
>> >> The issue isn't why or why not static, Jeff - the issue is that we
>> >> get
>> >> a compiler warning whenever we do a developer build.
>> > Right. The initial issue was the static-ness, though -- Ethan
>> > removed the static because some compilers were effectively inlining
>> > the function (and therefore removing the symbol from the library,
>> > making the parallel debugger attach stuff not work) presumably
>> > because a) the function was static, b) the function was short with
>> > no side effects, and c) the function was only called once within
>> > that .c file.
>> > Removing the "static" from the function prototype violated those
>> > assumptions so that it could no longer be inlined (And therefore
>> > symbol definitely appears in the library). But then we ran across
>> > the "must be prototyped" warning.
>> > That's where all this came from. :-)
>> > So -- I still don't think we need to DECLSPEC the prototype. :-)
>> >> On Sep 29, 2009, at 2:32 PM, Jeff Squyres wrote:
>> >> > I don't think we need to DECLSPEC it, do we? We don't need (or
>> >> > want) this symbol to be visible at the link level when user apps
>> >> > link against libmpi. You might want to put in a comment about
>> >> > it's not static so that we don't repeat this conversation again
>> >> next
>> >> > year. ;-)
>> >> >
>> >> > I think not having it DECLSPEC'ed should still work for the
>> >> debugger
>> >> > (since it worked before when it was static), but if you could
>> >> > it to be sure, that would be great...
>> > --
>> > Jeff Squyres
>> > jsquyres_at_[hidden]
>> > _______________________________________________
>> > devel mailing list
>> > devel_at_[hidden]
>> > http://www.open-mpi.org/mailman/listinfo.cgi/devel
>> devel mailing list
> Jeff Squyres
> devel mailing list