mailing list of musl libc
 help / color / mirror / code / Atom feed
* static linking problem
@ 2018-12-01 22:07 argante
  2018-12-02  0:18 ` Rich Felker
  0 siblings, 1 reply; 6+ messages in thread
From: argante @ 2018-12-01 22:07 UTC (permalink / raw)
  To: musl

Hi,

Does anyone have any idea why this is happening? The compiler (7.3.0) doesn't produce a statically linked binaries.

# cat test.c
#include <stdio.h>
int main() { printf("hello..\n"); return 0; }
# gcc -static test.c
# ldd a.out
	ldd (0x7f67f767e000)
# readelf -d a.out

Dynamic section at offset 0x1e88 contains 16 entries:
  Tag        Type                         Name/Value
 0x0000000000000010 (SYMBOLIC)           0x0
 0x000000000000000c (INIT)               0x290
 0x000000000000000d (FINI)               0x1207
 0x0000000000000004 (HASH)               0x158
 0x0000000000000005 (STRTAB)             0x180
 0x0000000000000006 (SYMTAB)             0x168
 0x000000000000000a (STRSZ)              1 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x202000
 0x0000000000000007 (RELA)               0x188
 0x0000000000000008 (RELASZ)             264 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffb (FLAGS_1)            Flags: PIE
 0x000000006ffffff9 (RELACOUNT)          11
 0x0000000000000000 (NULL)               0x0

# /usr/local/musl/bin/musl-gcc -static test.c
# ldd a.out
	ldd (0x7f5a608f9000)
# gcc -static -specs=/lib/musl-gcc.specs test.c
# ldd a.out
	ldd (0x7fb6c936f000)
# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-linux-musl/7.3.0/lto-wrapper
Target: x86_64-linux-musl
Configured with: ./configure CFLAGS='-Os -g0' CXXFLAGS= --enable-languages=c,c++ --disable-nls --disable-multilib --disable-werror --disable-libmudflap --disable-libsanitizer --disable-gnu-indirect-function --disable-libmpx --disable-libssp --disable-symver --disable-libgomp --disable-fixed-point --enable-tls --enable-deterministic-archives --enable-__cxa_atexit --enable-default-pie --build=x86_64-linux-musl
Thread model: posix
gcc version 7.3.0 (GCC)


without '-static' everything looks ok

# gcc test.c
# ldd a.out
	/lib/ld-musl-x86_64.so.1 (0x7ff0dca25000)
	libc.so => /lib/ld-musl-x86_64.so.1 (0x7ff0dca25000)


Best regards



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: static linking problem
  2018-12-01 22:07 static linking problem argante
@ 2018-12-02  0:18 ` Rich Felker
  2018-12-02 17:20   ` argante
  0 siblings, 1 reply; 6+ messages in thread
From: Rich Felker @ 2018-12-02  0:18 UTC (permalink / raw)
  To: musl; +Cc: argante

On Sat, Dec 01, 2018 at 10:07:53PM +0000, argante wrote:
> Hi,
> 
> Does anyone have any idea why this is happening? The compiler (7.3.0) doesn't produce a statically linked binaries.
> 
> # cat test.c
> #include <stdio.h>
> int main() { printf("hello..\n"); return 0; }
> # gcc -static test.c
> # ldd a.out
> 	ldd (0x7f67f767e000)
> # readelf -d a.out
> 
> Dynamic section at offset 0x1e88 contains 16 entries:
>   Tag        Type                         Name/Value
>  0x0000000000000010 (SYMBOLIC)           0x0
>  0x000000000000000c (INIT)               0x290
>  0x000000000000000d (FINI)               0x1207
>  0x0000000000000004 (HASH)               0x158
>  0x0000000000000005 (STRTAB)             0x180
>  0x0000000000000006 (SYMTAB)             0x168
>  0x000000000000000a (STRSZ)              1 (bytes)
>  0x000000000000000b (SYMENT)             24 (bytes)
>  0x0000000000000015 (DEBUG)              0x0
>  0x0000000000000003 (PLTGOT)             0x202000
>  0x0000000000000007 (RELA)               0x188
>  0x0000000000000008 (RELASZ)             264 (bytes)
>  0x0000000000000009 (RELAENT)            24 (bytes)
>  0x000000006ffffffb (FLAGS_1)            Flags: PIE
>  0x000000006ffffff9 (RELACOUNT)          11
>  0x0000000000000000 (NULL)               0x0

This does not indicate that the program is dynamic-linked, just that
it's PIE. Use readelf -l and look for INTERP. If it's present, the
program is dynamic linked. If it's absent, the program is static
linked.

> # /usr/local/musl/bin/musl-gcc -static test.c
> # ldd a.out
> 	ldd (0x7f5a608f9000)
> # gcc -static -specs=/lib/musl-gcc.specs test.c
> # ldd a.out
> 	ldd (0x7fb6c936f000)

Is this the musl ldd? I believe it will do this or similar, and that's
a known bug or at least limitation. It should report that the program
is not dynamic-linked.

> # gcc -v
> Using built-in specs.
> COLLECT_GCC=gcc
> COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-linux-musl/7.3.0/lto-wrapper
> Target: x86_64-linux-musl
> Configured with: ./configure CFLAGS='-Os -g0' CXXFLAGS= --enable-languages=c,c++ --disable-nls --disable-multilib --disable-werror --disable-libmudflap --disable-libsanitizer --disable-gnu-indirect-function --disable-libmpx --disable-libssp --disable-symver --disable-libgomp --disable-fixed-point --enable-tls --enable-deterministic-archives --enable-__cxa_atexit --enable-default-pie --build=x86_64-linux-musl
> Thread model: posix
> gcc version 7.3.0 (GCC)
> 
> 
> without '-static' everything looks ok
> 
> # gcc test.c
> # ldd a.out
> 	/lib/ld-musl-x86_64.so.1 (0x7ff0dca25000)
> 	libc.so => /lib/ld-musl-x86_64.so.1 (0x7ff0dca25000)

This is dynamic-linked, yes. But there's nothing wrong with your
static-linked program. If you really don't want pie, use -no-pie or a
toolchain that wasn't built to produce pie by default (gcc's
--enable-default-pie option at configure time).

Rich


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: static linking problem
  2018-12-02  0:18 ` Rich Felker
@ 2018-12-02 17:20   ` argante
  2018-12-02 18:15     ` Szabolcs Nagy
  0 siblings, 1 reply; 6+ messages in thread
From: argante @ 2018-12-02 17:20 UTC (permalink / raw)
  To: musl

‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Sunday, 2 December 2018 01:18, Rich Felker <dalias@libc.org> wrote:

> On Sat, Dec 01, 2018 at 10:07:53PM +0000, argante wrote:
> This does not indicate that the program is dynamic-linked, just that
> it's PIE. Use readelf -l and look for INTERP. If it's present, the
> program is dynamic linked. If it's absent, the program is static
> linked.
>

> > ldd a.out
> >
> > ==========
> >
> > ldd (0x7fb6c936f000)
>
> Is this the musl ldd? I believe it will do this or similar, and that's
> a known bug or at least limitation. It should report that the program
> is not dynamic-linked.
>

> > /lib/ld-musl-x86_64.so.1 (0x7ff0dca25000)
> > libc.so => /lib/ld-musl-x86_64.so.1 (0x7ff0dca25000)
>
> This is dynamic-linked, yes. But there's nothing wrong with your
> static-linked program. If you really don't want pie, use -no-pie or a
> toolchain that wasn't built to produce pie by default (gcc's
> --enable-default-pie option at configure time).
>
> Rich


Rich, thank you for your help.


I did everything step by step from scratch. Maybe it's a long mail, but shows stages and results.


I have a basic tool (make, cp, rm, sed etc.) and musl-cross toolchain in /cross dir (plus symlinks in cross/bin).

# ls /cross/
bin  include  lib  libexec  share  x86_64-linux-musl

# # cp libc.so from /cross/x86_64-linux-musl/lib/ to /lib
# ls -l /lib/
lrwxrwxrwx    1 root     root           12 Dec  2 09:11 ld-musl-x86_64.so.1 -> /lib/libc.so
-rwxr-xr-x    1 root     root       740888 Dec  2 09:10 libc.so


I also prepared simple scripts in /usr/ports:

# ls /usr/ports/
binutils  gcc  gmp  mpc  mpfr  musl


MUSL
----
# cd /usr/ports/musl/
# ls
build.sh  musl-1.1.20.tar.gz
# cat build.sh
#!/bin/sh
name=$(basename $(pwd))
version="1.1.20"
rm -rf $name-$version
tar zxf $name-$version.tar.gz
cd $name-$version

./configure \
	--bindir/usr/bin \
	--includedir=/usr/include \
	--syslibdir=/lib \
	--libdir=/lib \
	--enable-gcc-wrapper \
	--disable-debug \
	--enable-optimize \
	|| exit 1

make || exit 1
make install || exit 1
cd .. && rm -rf $name-$version

# ./build.sh
# ls -l /lib/
-rw-r--r--    1 root     root         1624 Dec  2 11:48 Scrt1.o
-rw-r--r--    1 root     root         1576 Dec  2 11:48 crt1.o
-rw-r--r--    1 root     root         1016 Dec  2 11:48 crti.o
-rw-r--r--    1 root     root          960 Dec  2 11:48 crtn.o
lrwxrwxrwx    1 root     root           12 Dec  2 09:11 ld-musl-x86_64.so.1 -> /lib/libc.so
-rw-r--r--    1 root     root      2573588 Dec  2 11:48 libc.a
-rwxr-xr-x    1 root     root       737368 Dec  2 11:48 libc.so
-rw-r--r--    1 root     root            8 Dec  2 11:48 libcrypt.a
-rw-r--r--    1 root     root            8 Dec  2 11:48 libdl.a
-rw-r--r--    1 root     root            8 Dec  2 11:48 libm.a
-rw-r--r--    1 root     root            8 Dec  2 11:48 libpthread.a
-rw-r--r--    1 root     root            8 Dec  2 11:48 libresolv.a
-rw-r--r--    1 root     root            8 Dec  2 11:48 librt.a
-rw-r--r--    1 root     root            8 Dec  2 11:48 libutil.a
-rw-r--r--    1 root     root            8 Dec  2 11:48 libxnet.a
-rw-r--r--    1 root     root          539 Dec  2 11:48 musl-gcc.specs
-rw-r--r--    1 root     root         2192 Dec  2 11:48 rcrt1.o

# /lib/ld-musl-x86_64.so.1
musl libc (x86_64)
Version 1.1.20
Dynamic Program Loader
Usage: /lib/ld-musl-x86_64.so.1 [options] [--] pathname [args]


GMP
---
# ls
build.sh  gmp-6.1.2.tar.gz
# cat build.sh
#!/bin/sh
name=$(basename $(pwd))
version="6.1.2"
rm -rf $name-$version
tar zxfp $name-$version.tar.gz
cd $name-$version || exit 1

./configure \
	--disable-shared || exit 1

make || exit 1
make install || exit 1
cd .. && rm -rf $name-$version

MPFR
----
#!/bin/sh
name=$(basename $(pwd))
version="3.1.4"
rm -rf $name-$version
tar zxfp $name-$version.tar.gz
cd $name-$version || exit 1

CFLAGS="-I/usr/local/include" \
LDFLAGS="-L/usr/local/lib" \
./configure \
	--disable-shared || exit 1

make || exit 1
make install || exit 1
cd .. && rm -rf $name-$version

MPC
---
#!/bin/sh
name=$(basename $(pwd))
version="1.0.3"
rm -rf $name-$version
tar zxfp $name-$version.tar.gz
cd $name-$version || exit 1

CFLAGS="-I/usr/local/include" \
LDFLAGS="-L/usr/local/lib" \
./configure \
	--disable-shared || exit 1

make || exit 1
make install || exit 1
cd .. && rm -rf $name-$version


BINUTILS
--------
I suppose it could be a problem with ld. In this test I used patches from Alpine:

https://git.alpinelinux.org/cgit/aports/tree/main/binutils

# ls
binutils-2.31.1.tar.gz                x86-Add-a-GNU_PROPERTY_X86_ISA_1_USED-note-if-needed.patch
binutils-ld-fix-static-linking.patch  x86-Properly-add-X86_ISA_1_NEEDED-property.patch
build.sh                              x86-Properly-merge-GNU_PROPERTY_X86_ISA_1_USED.patch

# cat build.sh
#!/bin/sh
name=$(basename $(pwd))
version="2.31.1"
rm -rf $name-$version
tar zxfp $name-$version.tar.gz
cd $name-$version || exit 1

patch -p1 -i ../binutils-ld-fix-static-linking.patch
patch -p1 -i ../x86-Add-a-GNU_PROPERTY_X86_ISA_1_USED-note-if-needed.patch
patch -p1 -i ../x86-Properly-add-X86_ISA_1_NEEDED-property.patch
patch -p1 -i ../x86-Properly-merge-GNU_PROPERTY_X86_ISA_1_USED.patch

./configure \
	--disable-shared \
	--disable-static \
	--disable-nls \
	--disable-install-libiberty \
	--enable-threads \
	--disable-obsolete \
	--enable-lto \
	--enable-plugins \
	--disable-multilib

make || exit 1
make install || exit 1
cd .. && rm -rf $name-$version


GCC
---
# ls
0001-ssp_nonshared.diff                                    0010-static-pie-support.diff
0002-posix_memalign.diff                                   0011-j2.diff
0003-cilkrts.diff                                          0012-s390x-muslldso.diff
0004-libatomic-test-fix.diff                               0013-microblaze-pr65649.diff
0005-libgomp-test-fix.diff                                 0014-ldbl128-config.diff
0006-libitm-test-fix.diff                                  0015-m68k.diff
0007-libvtv-test-fix.diff                                  0016-invalid_tls_model.diff
0008-Revert-PR-driver-81523-Make-static-override-pie.diff  build.sh
0009-Revert-RS6000-linux-startfile-endfile.diff            gcc-7.3.0.tar.gz

# cat build.sh
#!/bin/sh

version="7.3.0"

rm -rf gcc-$version
tar zxfvp gcc-${version}.tar.gz || exit 1

cd gcc-${version}

patch -p1 -i ../0001-ssp_nonshared.diff
patch -p1 -i ../0002-posix_memalign.diff
#patch -p1 -i ../0003-cilkrts.diff
patch -p1 -i ../0004-libatomic-test-fix.diff
patch -p1 -i ../0005-libgomp-test-fix.diff
patch -p1 -i ../0006-libitm-test-fix.diff
patch -p1 -i ../0007-libvtv-test-fix.diff
patch -p1 -i ../0008-Revert-PR-driver-81523-Make-static-override-pie.diff
patch -p1 -i ../0009-Revert-RS6000-linux-startfile-endfile.diff
patch -p1 -i ../0010-static-pie-support.diff
patch -p1 -i ../0011-j2.diff
patch -p1 -i ../0012-s390x-muslldso.diff
patch -p1 -i ../0013-microblaze-pr65649.diff
patch -p1 -i ../0014-ldbl128-config.diff
patch -p1 -i ../0015-m68k.diff
patch -p1 -i ../0016-invalid_tls_model.diff

./configure \
	CFLAGS="-Os -g0" \
	CXXFLAGS="${CFLAGS}" \
	--enable-languages=c,c++ \
	--disable-nls \
	--disable-multilib \
	--disable-werror \
	--disable-libmudflap \
	--disable-libsanitizer \
	--disable-gnu-indirect-function \
	--disable-libmpx \
	--disable-libssp \
	--disable-symver \
	--disable-libgomp \
	--disable-fixed-point \
	--enable-tls \
	--enable-deterministic-archives \
	--enable-__cxa_atexit \
	--enable-default-pie \
	--build=x86_64-linux-musl \
	--with-mpc=/usr/local

make -j4 || exit 1
make install || exit 1
cd .. && rm -rf gcc-$version

# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-linux-musl/7.3.0/lto-wrapper
Target: x86_64-linux-musl
Configured with: ./configure CFLAGS='-Os -g0' CXXFLAGS= --enable-languages=c,c++ --disable-nls --disable-multilib --disable-werror --disable-libmudflap --disable-libsanitizer --disable-gnu-indirect-function --disable-libmpx --disable-libssp --disable-symver --disable-libgomp --disable-fixed-point --enable-tls --enable-deterministic-archives --enable-__cxa_atexit --enable-default-pie --build=x86_64-linux-musl --with-mpc=/usr/local
Thread model: posix
gcc version 7.3.0 (GCC)





tests:
======

# cat test.c
#include <stdio.h>
int main() { printf("hello..\n"); return 0; }



1. musl-cross gcc
-----------------

# gcc -static test.c
# ldd a.out
ldd: a.out: Not a valid dynamic program

# gcc -static -fpie test.c
# ldd a.out
ldd: a.out: Not a valid dynamic program

# readelf -l a.out

Elf file type is EXEC (Executable file)
Entry point 0x400154
There are 4 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x0000000000000f0c 0x0000000000000f0c  R E    200000
  LOAD           0x0000000000000fe0 0x0000000000600fe0 0x0000000000600fe0
                 0x0000000000000128 0x0000000000000838  RW     200000
  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000000  RW     10
  GNU_RELRO      0x0000000000000fe0 0x0000000000600fe0 0x0000000000600fe0
                 0x0000000000000020 0x0000000000000020  R      1

 Section to Segment mapping:
  Segment Sections...
   00     .init .text .fini .rodata .eh_frame
   01     .ctors .dtors .data .bss
   02
   03     .ctors .dtors





2. New toolchain
----------------

# gcc test.c
# ldd a.out
	/lib/ld-musl-x86_64.so.1 (0x7f342831a000)
	libc.so => /lib/ld-musl-x86_64.so.1 (0x7f342831a000)


# gcc -static test.c
/usr/local/bin/ld: /lib/libc.a(__libc_start_main.o): relocation R_X86_64_32 against `.rodata.__init_libc.str1.1' can not be used when making a PIE object; recompile with -fPIC
/usr/local/bin/ld: /lib/libc.a(exit.o): relocation R_X86_64_32 against undefined hidden symbol `__fini_array_end' can not be used when making a PIE object
/usr/local/bin/ld: /lib/libc.a(puts.o): relocation R_X86_64_32 against hidden symbol `__stdout_FILE' can not be used when making a PIE object
/usr/local/bin/ld: /lib/libc.a(__init_tls.o): relocation R_X86_64_32S against undefined hidden symbol `__libc' can not be used when making a PIE object
/usr/local/bin/ld: /lib/libc.a(__stdout_write.o): relocation R_X86_64_32S against hidden symbol `__stdio_write' can not be used when making a PIE object
/usr/local/bin/ld: /lib/libc.a(ofl.o): relocation R_X86_64_32 against `.bss.ofl_lock' can not be used when making a PIE object; recompile with -fPIC
/usr/local/bin/ld: final link failed: nonrepresentable section on output
collect2: error: ld returned 1 exit status




I recompiled musl (with a new compiler), and now:


# gcc -static -fno-pie test.c
/usr/local/bin/ld: /tmp/ccJKiFnE.o: relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with -fPIC
/usr/local/bin/ld: final link failed: nonrepresentable section on output
collect2: error: ld returned 1 exit status


# gcc -static test.c
# ldd a.out
	ldd (0x7f76e24c3000)

# ls -lh /usr/bin/ldd
lrwxrwxrwx    1 root     root           12 Dec  2 11:26 /usr/bin/ldd -> /lib/libc.so


# readelf -l a.out

Elf file type is DYN (Shared object file)
Entry point 0x1062
There are 7 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000308 0x0000000000000308  R      0x1000
  LOAD           0x0000000000001000 0x0000000000001000 0x0000000000001000
                 0x0000000000000f7f 0x0000000000000f7f  R E    0x1000
  LOAD           0x0000000000002000 0x0000000000002000 0x0000000000002000
                 0x0000000000000094 0x0000000000000094  R      0x1000
  LOAD           0x0000000000002e58 0x0000000000003e58 0x0000000000003e58
                 0x00000000000002d8 0x00000000000009e0  RW     0x1000
  DYNAMIC        0x0000000000002e80 0x0000000000003e80 0x0000000000003e80
                 0x0000000000000150 0x0000000000000150  RW     0x8
  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000000  RW     0x10
  GNU_RELRO      0x0000000000002e58 0x0000000000003e58 0x0000000000003e58
                 0x00000000000001a8 0x00000000000001a8  R      0x1

 Section to Segment mapping:
  Segment Sections...
   00     .hash .gnu.hash .dynsym .dynstr .rela.dyn
   01     .init .plt .plt.got .text .fini
   02     .rodata .eh_frame
   03     .ctors .dtors .data.rel.ro .dynamic .got .got.plt .data .bss
   04     .dynamic
   05
   06     .ctors .dtors .data.rel.ro .dynamic .got




I still can't understand why musl-cross ldd works correctly, and new toolchain shows such a strange result. Did I overlook something? I even tried -Wl,--no-dynamic-linker.

Best regards





^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: static linking problem
  2018-12-02 17:20   ` argante
@ 2018-12-02 18:15     ` Szabolcs Nagy
  2018-12-02 19:25       ` argante
  0 siblings, 1 reply; 6+ messages in thread
From: Szabolcs Nagy @ 2018-12-02 18:15 UTC (permalink / raw)
  To: musl

* argante <argante@pm.me> [2018-12-02 17:20:15 +0000]:
> ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
> On Sunday, 2 December 2018 01:18, Rich Felker <dalias@libc.org> wrote:
> > On Sat, Dec 01, 2018 at 10:07:53PM +0000, argante wrote:
> > > /lib/ld-musl-x86_64.so.1 (0x7ff0dca25000)
> > > libc.so => /lib/ld-musl-x86_64.so.1 (0x7ff0dca25000)
> >
> > This is dynamic-linked, yes. But there's nothing wrong with your
> > static-linked program. If you really don't want pie, use -no-pie or a
> > toolchain that wasn't built to produce pie by default (gcc's
> > --enable-default-pie option at configure time).
...
> I did everything step by step from scratch. Maybe it's a long mail, but shows stages and results.
...
> ./configure \
> 	CFLAGS="-Os -g0" \
> 	CXXFLAGS="${CFLAGS}" \
> 	--enable-languages=c,c++ \
> 	--disable-nls \
> 	--disable-multilib \
> 	--disable-werror \
> 	--disable-libmudflap \
> 	--disable-libsanitizer \
> 	--disable-gnu-indirect-function \
> 	--disable-libmpx \
> 	--disable-libssp \
> 	--disable-symver \
> 	--disable-libgomp \
> 	--disable-fixed-point \
> 	--enable-tls \
> 	--enable-deterministic-archives \
> 	--enable-__cxa_atexit \
> 	--enable-default-pie \
       ^^^^^^^^^^^^^^^^^^^^^
> 	--build=x86_64-linux-musl \
> 	--with-mpc=/usr/local
...
> I still can't understand why musl-cross ldd works correctly, and new toolchain shows such a strange result. Did I overlook something? I even tried -Wl,--no-dynamic-linker.

what do you mean strange?

it seems to work exactly as expected.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: static linking problem
  2018-12-02 18:15     ` Szabolcs Nagy
@ 2018-12-02 19:25       ` argante
  2018-12-02 21:16         ` Rich Felker
  0 siblings, 1 reply; 6+ messages in thread
From: argante @ 2018-12-02 19:25 UTC (permalink / raw)
  To: musl


‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Sunday, 2 December 2018 19:15, Szabolcs Nagy <nsz@.net> wrote:

> * argante argante@ [2018-12-02 17:20:15 +0000]:
>
> > ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
> > On Sunday, 2 December 2018 01:18, Rich Felker dalias@ wrote:
> >
> > > On Sat, Dec 01, 2018 at 10:07:53PM +0000, argante wrote:
> > >
> > > > /lib/ld-musl-x86_64.so.1 (0x7ff0dca25000)
> > > > libc.so => /lib/ld-musl-x86_64.so.1 (0x7ff0dca25000)
> > >
> > > This is dynamic-linked, yes. But there's nothing wrong with your
> > > static-linked program. If you really don't want pie, use -no-pie or a
> > > toolchain that wasn't built to produce pie by default (gcc's
> > > --enable-default-pie option at configure time).
>
> > ./configure \
> > CFLAGS="-Os -g0" \
> > CXXFLAGS="${CFLAGS}" \
> > --enable-languages=c,c++ \

> > --enable-default-pie \
>
>        ^^^^^^^^^^^^^^^^^^^^^
>
> > I still can't understand why musl-cross ldd works correctly, and new toolchain shows such a strange result. Did I overlook something? I even tried -Wl,--no-dynamic-linker.
>
> what do you mean strange?
>
> it seems to work exactly as expected.


I checked Alpine, where there is also a default pie. Indeed, ldd behaves the same:

# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-alpine-linux-musl/6.4.0/lto-wrapper
Target: x86_64-alpine-linux-musl
Configured with: /home/buildozer/aports/main/gcc/src/gcc-6.4.0/configure --prefix=/usr
...
--enable-__cxa_atexit --enable-default-pie --enable-cloog-backend --enable-
                      ^^^^^^^^^^^^^^^^^^^^
Thread model: posix
gcc version 6.4.0 (Alpine 6.4.0)

# gcc -static test.c
# ldd a.out
	ldd (0x7f02ef28d000)


‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Sunday, 2 December 2018 01:18, Rich Felker <dalias@> wrote:

> On Sat, Dec 01, 2018 at 10:07:53PM +0000, argante wrote:

> > ldd a.out
> >
> > ==========
> >
> > ldd (0x7fb6c936f000)
>
> Is this the musl ldd? I believe it will do this or similar, and that's
> a known bug or at least limitation. It should report that the program
> is not dynamic-linked.


yes, this is musl ldd.


but Gentoo:

# gcc -v
Using built-in specs.
COLLECT_GCC=/usr/x86_64-gentoo-linux-musl/gcc-bin/7.3.0/gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-gentoo-linux-musl/7.3.0/lto-wrapper
Target: x86_64-gentoo-linux-musl
Configured with: /var/tmp/portage/sys-devel/gcc-7.3.0-r3/work/gcc-7.3.0/configure --host=x86_64-gentoo-linux-musl --build=x86_64-gentoo-linux-musl --prefix=/usr

...

--without-isl --disable-libsanitizer --enable-default-pie --enable-default-ssp
                                     ^^^^^^^^^^^^^^^^^^^^
Thread model: posix
gcc version 7.3.0 (Gentoo Hardened 7.3.0-r3 p1.4)


# gcc -static test.c
# ldd a.out
ldd: a.out: Not a valid dynamic program
# ls -l /usr/bin/ldd
lrwxrwxrwx 1 root root 24 Nov 13 21:27 /usr/bin/ldd -> /lib/ld-musl-x86_64.so.1

or:

# gcc -c -fPIE test.c
# gcc -static -pie test.o
# ldd a.out
ldd: a.out: Not a valid dynamic program
# readelf -l a.out

Elf file type is EXEC (Executable file)
Entry point 0x40014d
There are 4 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x000000000000133c 0x000000000000133c  R E    0x200000
  LOAD           0x0000000000001fd8 0x0000000000601fd8 0x0000000000601fd8
                 0x0000000000000130 0x0000000000000840  RW     0x200000
  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000000  RW     0x10
  GNU_RELRO      0x0000000000001fd8 0x0000000000601fd8 0x0000000000601fd8
                 0x0000000000000028 0x0000000000000028  R      0x1

 Section to Segment mapping:
  Segment Sections...
   00     .init .text .fini .rodata .eh_frame
   01     .ctors .dtors .data.rel.ro .data .bss
   02
   03     .ctors .dtors .data.rel.ro



that's why it seemed surprising to me.

thx


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: static linking problem
  2018-12-02 19:25       ` argante
@ 2018-12-02 21:16         ` Rich Felker
  0 siblings, 0 replies; 6+ messages in thread
From: Rich Felker @ 2018-12-02 21:16 UTC (permalink / raw)
  To: argante; +Cc: musl

On Sun, Dec 02, 2018 at 07:25:56PM +0000, argante wrote:
> 
> ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
> On Sunday, 2 December 2018 19:15, Szabolcs Nagy <nsz@.net> wrote:
> 
> > * argante argante@ [2018-12-02 17:20:15 +0000]:
> >
> > > ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
> > > On Sunday, 2 December 2018 01:18, Rich Felker dalias@ wrote:
> > >
> > > > On Sat, Dec 01, 2018 at 10:07:53PM +0000, argante wrote:
> > > >
> > > > > /lib/ld-musl-x86_64.so.1 (0x7ff0dca25000)
> > > > > libc.so => /lib/ld-musl-x86_64.so.1 (0x7ff0dca25000)
> > > >
> > > > This is dynamic-linked, yes. But there's nothing wrong with your
> > > > static-linked program. If you really don't want pie, use -no-pie or a
> > > > toolchain that wasn't built to produce pie by default (gcc's
> > > > --enable-default-pie option at configure time).
> >
> > > ./configure \
> > > CFLAGS="-Os -g0" \
> > > CXXFLAGS="${CFLAGS}" \
> > > --enable-languages=c,c++ \
> 
> > > --enable-default-pie \
> >
> >        ^^^^^^^^^^^^^^^^^^^^^
> >
> > > I still can't understand why musl-cross ldd works correctly, and new toolchain shows such a strange result. Did I overlook something? I even tried -Wl,--no-dynamic-linker.
> >
> > what do you mean strange?
> >
> > it seems to work exactly as expected.
> 
> 
> I checked Alpine, where there is also a default pie. Indeed, ldd behaves the same:
> 
> # gcc -v
> Using built-in specs.
> COLLECT_GCC=gcc
> COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-alpine-linux-musl/6.4.0/lto-wrapper
> Target: x86_64-alpine-linux-musl
> Configured with: /home/buildozer/aports/main/gcc/src/gcc-6.4.0/configure --prefix=/usr
> ....
> --enable-__cxa_atexit --enable-default-pie --enable-cloog-backend --enable-
>                       ^^^^^^^^^^^^^^^^^^^^
> Thread model: posix
> gcc version 6.4.0 (Alpine 6.4.0)
> 
> # gcc -static test.c
> # ldd a.out
> 	ldd (0x7f02ef28d000)
> 
> 
> ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
> On Sunday, 2 December 2018 01:18, Rich Felker <dalias@> wrote:
> 
> > On Sat, Dec 01, 2018 at 10:07:53PM +0000, argante wrote:
> 
> > > ldd a.out
> > >
> > > ==========
> > >
> > > ldd (0x7fb6c936f000)
> >
> > Is this the musl ldd? I believe it will do this or similar, and that's
> > a known bug or at least limitation. It should report that the program
> > is not dynamic-linked.
> 
> 
> yes, this is musl ldd.
> 
> 
> but Gentoo:
> 
> # gcc -v
> Using built-in specs.
> COLLECT_GCC=/usr/x86_64-gentoo-linux-musl/gcc-bin/7.3.0/gcc
> COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-gentoo-linux-musl/7.3.0/lto-wrapper
> Target: x86_64-gentoo-linux-musl
> Configured with: /var/tmp/portage/sys-devel/gcc-7.3.0-r3/work/gcc-7.3.0/configure --host=x86_64-gentoo-linux-musl --build=x86_64-gentoo-linux-musl --prefix=/usr
> 
> ....
> 
> --without-isl --disable-libsanitizer --enable-default-pie --enable-default-ssp
>                                      ^^^^^^^^^^^^^^^^^^^^
> Thread model: posix
> gcc version 7.3.0 (Gentoo Hardened 7.3.0-r3 p1.4)
> 
> 
> # gcc -static test.c
> # ldd a.out
> ldd: a.out: Not a valid dynamic program
> # ls -l /usr/bin/ldd
> lrwxrwxrwx 1 root root 24 Nov 13 21:27 /usr/bin/ldd -> /lib/ld-musl-x86_64.so.1
> 
> or:
> 
> # gcc -c -fPIE test.c
> # gcc -static -pie test.o
> # ldd a.out
> ldd: a.out: Not a valid dynamic program
> # readelf -l a.out
> 
> Elf file type is EXEC (Executable file)
> Entry point 0x40014d
> There are 4 program headers, starting at offset 64
> 
> Program Headers:
>   Type           Offset             VirtAddr           PhysAddr
>                  FileSiz            MemSiz              Flags  Align
>   LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
>                  0x000000000000133c 0x000000000000133c  R E    0x200000
>   LOAD           0x0000000000001fd8 0x0000000000601fd8 0x0000000000601fd8
>                  0x0000000000000130 0x0000000000000840  RW     0x200000
>   GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
>                  0x0000000000000000 0x0000000000000000  RW     0x10
>   GNU_RELRO      0x0000000000001fd8 0x0000000000601fd8 0x0000000000601fd8
>                  0x0000000000000028 0x0000000000000028  R      0x1
> 
>  Section to Segment mapping:
>   Segment Sections...
>    00     .init .text .fini .rodata .eh_frame
>    01     .ctors .dtors .data.rel.ro .data .bss
>    02
>    03     .ctors .dtors .data.rel.ro
> 
> 
> 
> that's why it seemed surprising to me.

There is absolutely nothing wrong here. This is what a static pie
looks like. I don't know what you expect but your expectations are
wrong.

Rich


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2018-12-02 21:16 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-01 22:07 static linking problem argante
2018-12-02  0:18 ` Rich Felker
2018-12-02 17:20   ` argante
2018-12-02 18:15     ` Szabolcs Nagy
2018-12-02 19:25       ` argante
2018-12-02 21:16         ` Rich Felker

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).