On Tue, 26 Mar 2013 21:48:42 +0200, Paul Irofti wrote:
> Good evening everyone,
> 
> I discovered about one or two weeks ago that I can't link any debug
> libraries on OpenBSD. At first I thought it was a cmake update[1] but
> then I started digging further and it turns out its our gcc.

This is not about debug, but profiling libraries.

> What threw me off is that gcc-4.7 from ports behaves the same way, but
> I later discovered it's the same issue.
> 
> Anyway, the problem pops up when doing something like this:
> 
> -----------------------------------------------------------------------
> $ cc -shared -fpic  -o libtest.so.0.0  `lorder test.so test1.so|tsort -q`
> $
> -----------------------------------------------------------------------
> 
> versus something like this:
> 
> -----------------------------------------------------------------------
> $ cc -shared -fpic  -pg -o libtest.so.0.0  `lorder test.so test1.so|tsort -q`
> /usr/bin/ld: warning: cannot find entry symbol _start; defaulting to
> 0000000000400260
> $
> -----------------------------------------------------------------------
> 
> This used to work in the past and no longer does on -current.

It used to work in the sense that it produced a shared library with
profiling and debug information.  But this information is useless on
OpenBSD.  Profiling only works with static executables/libraries.
Adding support for shared libraries would be non-trivial, and probably
need support in ld.so.  Look at sprof on Linux (even there, gprof
doesn't support shared libraries).

The correct approach here is probably to error out when -pg is given in
combination with -shared on OpenBSD.

Have you seen this command line in a real-world build system?  In that
case, just disable -pg.

> I tested on a 5.1 system and the last command links libtest properly
> without an error.
> 
> I tracked it down to the commit that enabled PIE support on OpenBSD.
> 
> I looked at the specs from other operating systems and Linux
> distributions and I haven't found any -nopie references not only in the
> libs section, but throughout the entire spec.

That's because nobody else has the -nopie option in ld.

> Thus I propose the following diff that removes the nopie bits.

No, this would break linking profiled executables.

> An identical diff is needed for the ports tree and I will take care of
> it if this is accepted. So comments, okays?
> 
> Cheers,
> Paul Irofti
> 
> 
> [1] -- http://marc.info/?l=openbsd-ports&m=136371733926696&w=2
> 
> Index: gcc/gcc.c
> ===================================================================
> RCS file: /cvs/src/gnu/gcc/gcc/gcc.c,v
> retrieving revision 1.2
> diff -u -p -r1.2 gcc.c
> --- gcc/gcc.c 28 Aug 2012 18:59:28 -0000      1.2
> +++ gcc/gcc.c 26 Mar 2013 19:33:05 -0000
> @@ -684,7 +684,7 @@ proper position among the other output f
>  
>  #ifndef LINK_PIE_SPEC
>  #ifdef HAVE_LD_PIE
> -#define LINK_PIE_SPEC "%{pie:-pie} %{p|pg|nopie:-nopie} "
> +#define LINK_PIE_SPEC "%{pie:-pie} "
>  #else
>  #define LINK_PIE_SPEC "%{pie:} "
>  #endif
> 
> 

Reply via email to