From: Zack Weinberg <zack@codesourcery.com>
To: gcc@gcc.gnu.org, Stan Shebs <shebs@apple.com>,
Andrew Pinski <apinski@apple.com>,
Richard Henderson <rth@redhat.com>
Subject: Darwin assert.h / shared libgcc mess
Date: Mon, 15 Nov 2004 21:43:00 -0000 [thread overview]
Message-ID: <87oehyq1km.fsf@codesourcery.com> (raw)
I sat down to look into the problems with <assert.h> on Darwin, which
were exposed by Andrew Pinski's patch on Nov 3
* config/darwin.h (REAL_LIBGCC_SPEC): Define to use shared
libgcc for shared libraries.
As I suspected, the apparent problem is just the tip of a very large
iceberg. I have traced it pretty far back, and would now like to
discuss a solution, before I go off and implement it.
1) /usr/include/assert.h on Darwin depends on __eprintf being provided
by libgcc. This is not terribly surprising, considering that GCC
has been the system compiler for Darwin since NeXT days.
i) It is also seriously non-ISO-C compliant. This is because someone
blindly copied the results of a buggy fixincludes edit into
Darwin's CVS tree. [The fixincludes edits broken_assert_stdio and
broken_assert_stdlib both produce an <assert.h> which is
idempotent. This is wrong.]
Given (1), IMO the correct thing to do is put __eprintf into
libgcc.dylib on Darwin; Andrew's proposed fix isn't ISO compliant
either (assert() is required to write to stderr, but <assert.h> is
required not to declare "stderr", or "fprintf" or "abort" for that
matter). However, when one attempts to fix that, one encounters
another set of problems:
2) There is no way to tell mklibgcc.in to add something from libgcc2.c
to both libgcc.a and libgcc.so. Even if there were, by itself that
wouldn't work, because
3) ... the version script would knock it out again. However, there
*is* a facility for adding target-specific version map entries.
2i) ... but this doesn't matter, because as far as I can tell
t-slibgcc-darwin is not actually *using* the generated version map
3i) ... and that is fortunate, because (a) as far as I can tell,
Darwin ld does not support full-fledged symbol versioning (it does
support flat export lists), and (b) libgcc-darwin.ver is out of
sync with libgcc-std.ver. [And the same is true for
config/sh/libgcc-std.ver, incidentally.]
---
My proposed fix for all this is as follows.
1) Ship a *correct* assert.h, as a replace-entire-file fixincludes
edit, which recognizes the broken Darwin /usr/include/assert.h. If
I can swing it, it will also subsume the buggy
broken_assert_{stdio,stdlib} fixes. This corrected assert.h will
continue to use __eprintf. Alternatively, if people prefer, it
could use the more recent convention of __assert, per, eg. FreeBSD
/usr/include/assert.h. (The advantage of this is there aren't
copies of the "%s:%d:%s: assertion failed: %s" string constant
everywhere that uses assert.)
2) Put __eprintf back into the shared libgcc, as an exported symbol,
for all !inhibit_libc targets, so that fixincludes can rely on its
being there. (If we instead use __assert, then __eprintf will
remain a static-library-only backward compatibility symbol.)
3) For the sake of future flexibility, move the hardwired list of
static-and-shared functions from mklibgcc.in to the Makefile so
that it can be adjusted in t-fragments.
4) Add the ability to add a leading underscore to all symbol names to
mkmap-flat.awk and mkmap-symver.awk. Also add the ability to
delete symbols from the list, in a target-specific .ver file.
Update Darwin and SH target configuration to match, and delete the
out-of-sync libgcc-darwin.ver and config/sh/libgcc-std.ver.
5) Determine for certain whether or not Darwin ld supports symbol
versioning. Correct t-slibgcc-darwin to use the appropriate mkmap
file and to actually apply the map to the generated libgcc.dylib.
i) Nudzh the Darwin developers to put __assert in libSystem and
provide a correct /usr/include/assert.h (y'all can just copy it
from FreeBSD! Only with attribute noreturn, please).
Thoughts?
zw
next reply other threads:[~2004-11-15 20:50 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-11-15 21:43 Zack Weinberg [this message]
2004-11-15 22:42 ` Geoffrey Keating
2004-11-16 3:49 ` Zack Weinberg
2004-11-22 22:50 ` Geoff Keating
2004-11-22 23:57 ` Zack Weinberg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87oehyq1km.fsf@codesourcery.com \
--to=zack@codesourcery.com \
--cc=apinski@apple.com \
--cc=gcc@gcc.gnu.org \
--cc=rth@redhat.com \
--cc=shebs@apple.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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 read-only IMAP folder(s) and NNTP newsgroup(s).