Absolute symlink breaks cross compilation

Submitted by Андрей Аладьев on Jan. 17, 2020, 11:24 p.m.

Details

Message ID CAMw0szLp2XHhf5Enfb5AVv3qrs_HRnsJL72Kt-7zii6EdEJ15A@mail.gmail.com
State New
Series "Absolute symlink breaks cross compilation"
Headers show

Commit Message

Андрей Аладьев Jan. 17, 2020, 11:24 p.m.
Hello. Gentoo users find that it is not possible to cross compile musl. See
here https://bugs.gentoo.org/645626 more details.

I am sending to you proposed patch that is related to upstream. Please keep
all installed symlinks relative. Thank you.

Patch hide | download patch | download mbox

diff --git a/Makefile b/Makefile
index bd8f5c38..81bf33d5 100644
--- a/Makefile
+++ b/Makefile
@@ -209,7 +209,7 @@  $(DESTDIR)$(includedir)/%: $(srcdir)/include/%
 	$(INSTALL) -D -m 644 $< $@
 
 $(DESTDIR)$(LDSO_PATHNAME): $(DESTDIR)$(libdir)/libc.so
-	$(INSTALL) -D -l $(libdir)/libc.so $@ || true
+	$(INSTALL) -D -l $$(realpath --no-symlinks --relative-to=$$(dirname $@) $(DESTDIR)$(libdir)/libc.so) $@ || true
 
 install-libs: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(if $(SHARED_LIBS),$(DESTDIR)$(LDSO_PATHNAME),)
 

Comments

Khem Raj Jan. 18, 2020, 4:29 a.m.
On Fri, Jan 17, 2020 at 6:19 PM Андрей Аладьев <aladjev.andrew@gmail.com> wrote:
>
> Hello. Gentoo users find that it is not possible to cross compile musl. See here https://bugs.gentoo.org/645626 more details.
>
> I am sending to you proposed patch that is related to upstream. Please keep all installed symlinks relative. Thank you.

In yocto we are carrying slightly different patch to achieve same
https://github.com/kraj/musl/commit/102f35b194a3405b30001ff08cfd54752179376f
Rich Felker Jan. 18, 2020, 5:14 a.m.
On Sat, Jan 18, 2020 at 02:24:49AM +0300, Андрей Аладьев wrote:
> Hello. Gentoo users find that it is not possible to cross compile musl. See
> here https://bugs.gentoo.org/645626 more details.
> 
> I am sending to you proposed patch that is related to upstream. Please keep
> all installed symlinks relative. Thank you.

> diff --git a/Makefile b/Makefile
> index bd8f5c38..81bf33d5 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -209,7 +209,7 @@ $(DESTDIR)$(includedir)/%: $(srcdir)/include/%
>  	$(INSTALL) -D -m 644 $< $@
>  
>  $(DESTDIR)$(LDSO_PATHNAME): $(DESTDIR)$(libdir)/libc.so
> -	$(INSTALL) -D -l $(libdir)/libc.so $@ || true
> +	$(INSTALL) -D -l $$(realpath --no-symlinks --relative-to=$$(dirname $@) $(DESTDIR)$(libdir)/libc.so) $@ || true
>  
>  install-libs: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(if $(SHARED_LIBS),$(DESTDIR)$(LDSO_PATHNAME),)
>  

I don't understand what you mean by it "breaks cross compilation". The
ldso link produced is not used for compiling anything; it's only used
for executing programs, which you don't do when cross compiling musl
or cross compiling applications against it. The link is setup to be
installed on the $host, not to be used on the $build where it's not
needed.

Could you could explain what specifically you're trying to do that's
not working as desired?

Rich
Khem Raj Jan. 18, 2020, 7:27 p.m.
On Fri, Jan 17, 2020 at 9:15 PM Rich Felker <dalias@libc.org> wrote:
>
> On Sat, Jan 18, 2020 at 02:24:49AM +0300, Андрей Аладьев wrote:
> > Hello. Gentoo users find that it is not possible to cross compile musl. See
> > here https://bugs.gentoo.org/645626 more details.
> >
> > I am sending to you proposed patch that is related to upstream. Please keep
> > all installed symlinks relative. Thank you.
>
> > diff --git a/Makefile b/Makefile
> > index bd8f5c38..81bf33d5 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -209,7 +209,7 @@ $(DESTDIR)$(includedir)/%: $(srcdir)/include/%
> >       $(INSTALL) -D -m 644 $< $@
> >
> >  $(DESTDIR)$(LDSO_PATHNAME): $(DESTDIR)$(libdir)/libc.so
> > -     $(INSTALL) -D -l $(libdir)/libc.so $@ || true
> > +     $(INSTALL) -D -l $$(realpath --no-symlinks --relative-to=$$(dirname $@) $(DESTDIR)$(libdir)/libc.so) $@ || true
> >
> >  install-libs: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(if $(SHARED_LIBS),$(DESTDIR)$(LDSO_PATHNAME),)
> >
>
> I don't understand what you mean by it "breaks cross compilation". The
> ldso link produced is not used for compiling anything; it's only used
> for executing programs, which you don't do when cross compiling musl
> or cross compiling applications against it. The link is setup to be
> installed on the $host, not to be used on the $build where it's not
> needed.
>
> Could you could explain what specifically you're trying to do that's
> not working as desired?
>

If you look at commit msg
for https://github.com/kraj/musl/commit/102f35b194a3405b30001ff08cfd54752179376f

then you will see the usecase we have in for Yocto/OE
> Rich
Rich Felker Jan. 18, 2020, 9:54 p.m.
On Sat, Jan 18, 2020 at 11:27:43AM -0800, Khem Raj wrote:
> On Fri, Jan 17, 2020 at 9:15 PM Rich Felker <dalias@libc.org> wrote:
> >
> > On Sat, Jan 18, 2020 at 02:24:49AM +0300, Андрей Аладьев wrote:
> > > Hello. Gentoo users find that it is not possible to cross compile musl. See
> > > here https://bugs.gentoo.org/645626 more details.
> > >
> > > I am sending to you proposed patch that is related to upstream. Please keep
> > > all installed symlinks relative. Thank you.
> >
> > > diff --git a/Makefile b/Makefile
> > > index bd8f5c38..81bf33d5 100644
> > > --- a/Makefile
> > > +++ b/Makefile
> > > @@ -209,7 +209,7 @@ $(DESTDIR)$(includedir)/%: $(srcdir)/include/%
> > >       $(INSTALL) -D -m 644 $< $@
> > >
> > >  $(DESTDIR)$(LDSO_PATHNAME): $(DESTDIR)$(libdir)/libc.so
> > > -     $(INSTALL) -D -l $(libdir)/libc.so $@ || true
> > > +     $(INSTALL) -D -l $$(realpath --no-symlinks --relative-to=$$(dirname $@) $(DESTDIR)$(libdir)/libc.so) $@ || true
> > >
> > >  install-libs: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(if $(SHARED_LIBS),$(DESTDIR)$(LDSO_PATHNAME),)
> > >
> >
> > I don't understand what you mean by it "breaks cross compilation". The
> > ldso link produced is not used for compiling anything; it's only used
> > for executing programs, which you don't do when cross compiling musl
> > or cross compiling applications against it. The link is setup to be
> > installed on the $host, not to be used on the $build where it's not
> > needed.
> >
> > Could you could explain what specifically you're trying to do that's
> > not working as desired?
> >
> 
> If you look at commit msg
> for https://github.com/kraj/musl/commit/102f35b194a3405b30001ff08cfd54752179376f
> 
> then you will see the usecase we have in for Yocto/OE

OK. So it's specifically execution of target binaries via qemu-user
that's broken.

The above patch isn't suitable because it introduces a dependency on a
nonstandard utility, GNU realpath, and thereby breaks cross compiling
of musl from non-GNU-like systems. It also might introduce
dependencies of the staged-area symlink structure into the link
contents.

I'd probably be happy with a solution that involves a make or shell
expression to convert $(syslibdir) into a suitable number of
repetitions of ../ to prepend to $(libdir)/libc.so, but I'm mildly
concerned about whether there may be setups with symlinks where this
breaks.

There's also always been a school of thought that the direction of the
symlink should be reversed, so that libc.so is the symlink and ldso is
the actual file, but I believe I tried to do this at least once and
ran into reasons it was problematic. I'd have to go dig up old
conversations to try to remember why...

Rich