On 11 Jan 2017, at 22:42, Ian Lepore <i...@freebsd.org> wrote: > > On Wed, 2017-01-11 at 13:35 -0800, Ngie Cooper wrote: >> On Wed, Jan 11, 2017 at 10:47 AM, Dimitry Andric <d...@freebsd.org> >> wrote: >>> >>> Author: dim >>> Date: Wed Jan 11 18:47:00 2017 >>> New Revision: 311929 >>> URL: https://svnweb.freebsd.org/changeset/base/311929 >>> >>> Log: >>> Don't include <errno.h> in reloc_elf.c, as it includes <stand.h> >>> just >>> after it, which has a conflicting definition of errno. This >>> leads to >>> the following warning with clang 4.0.0: >>> >>> In file included from sys/boot/common/reloc_elf32.c:6: >>> In file included from sys/boot/common/reloc_elf.c:37: >>> /usr/obj/usr/src/tmp/usr/include/stand.h:155:12: error: this >>> function declaration is not a prototype [-Werror,-Wstrict- >>> prototypes] >>> extern int errno; >>> ^ >>> sys/sys/errno.h:46:26: note: expanded from macro 'errno' >>> #define errno (* __error()) >> It seems like libstand (once again) should be fixed, not the >> "offending code". >> -Ngie >> > > In this case it's not the library that's in error. Libstand is the > thing that implements errno, so it's the thing that must define it. > > The code that includes both errno.h and libstand.h was wrong. errno.h > is a standard header file used with libc, and the loader code doesn't > link with libc. > > The thing that amazes me is the usual: how did this ever work with gcc > 4.2?
The line: extern int errno; expanded to: extern int (* __error()); which is a declaration of an external function pointer called __error (albeit with an empty parameter list). Since nobody actually refers to this symbol in libstand, there are no later complaints. Interestingly, reloc_elf.c does not use errno at all, so I have no idea why the include was originally added. -Dimitry
signature.asc
Description: Message signed with OpenPGP using GPGMail