Problems with ld, libc, and "struct stat"

Jan Behrens jbe-mlist at magnetkern.de
Wed Oct 16 11:15:55 UTC 2019


On Wed, 16 Oct 2019 09:18:52 +0200
David Demelier <markand at malikania.fr> wrote:

> Le 15/10/2019 à 20:44, Jan Behrens a écrit :
> > I stumbled across a weird problem related stat() that (according to my
> > research) seems to be related to an update of the "struct stat"
> > C-structure in recent Kernel versions.
> > 
> > [...]
> > 
> >    stat("testlib.c", &sb);
> 
> Please test the result of stat otherwise sb is left untouched (so all 
> member undefined).

You are right, of course (this was just a quick and dirty demonstration).

> > But when I make a shared library like this, I get a different result:
> > 
> > % ld -shared -o testlib.so testlib.o
> 
> Hmm, we usually never call the linker itself when creating shared libraries.
> 
> Try instead: cc -shared -o testlib.so testlib.o
> 
> HTH
> -- 
> David

Thank you very much; I tried that, and it works properly:

% cc -Wall -c -fPIC -o testlib.o testlib.c
% cc -shared -o testlib.so testlib.o
% cc -Wall -o testprog `pwd`/testlib.so testprog.c
% ./testprog 
Size of testlib.c is 168 bytes.

I will from now on use cc instead of ld to create shared libraries.

I still wonder though if there is any documentation on this behavior
(and where to find it), whether it's FreeBSD related or LLVM related.
It feels a bit scary that using "ld" to make a shared library can
result in weird runtime behavior without even raising a warning.

Do you know any link where I find a more detailed explanation about why
I need to use "cc" instead of "ld" to create shared libraries? I assume
that "cc" adds the necessary options to "ld" that are otherwise
missing. But I don't see where this is documented.

When I search the man page for "cc" (clang - the Clang C, C++, and
Objective-C compiler), I even do not find any "-shared" option at all.

Only in the "ld" manpage (ld.lld – ELF linker from the LLVM project),
there is an entry about the "-shared" option:

     --shared
             Build a shared object.

Following the man pages, I would naïvely use "ld", which leads to the
bad and unexpected results as described in my original post.

Thanks again
Jan


P.S.: My setup is:

% freebsd-version
12.0-RELEASE-p10

% uname -i -K -m -p -r -s -U -v
FreeBSD 12.0-RELEASE-p10 FreeBSD 12.0-RELEASE-p10 GENERIC  amd64 amd64 GENERIC 1200086 1200086

% cc --version
FreeBSD clang version 6.0.1 (tags/RELEASE_601/final 335540) (based on LLVM 6.0.1)
Target: x86_64-unknown-freebsd12.0
Thread model: posix
InstalledDir: /usr/bin

% ld --version
LLD 6.0.1 (FreeBSD 335540-1200005) (compatible with GNU linkers)


More information about the freebsd-questions mailing list