Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Sat, 1 Dec 2018 19:18:21 -0500
From: Rich Felker <dalias@...c.org>
To: musl@...ts.openwall.com
Cc: argante <argante@...me>
Subject: Re: static linking problem

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

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.