Skip to content
This repository has been archived by the owner on Jul 24, 2024. It is now read-only.

Commit

Permalink
Remove -undefined error, --no-undefined LDFLAGS
Browse files Browse the repository at this point in the history
As far as I can tell, `-undefined error` was introduced mistakenly
to replace `--no-undefined`, which doesn't work Apple's cctools' ld.
The problem is, `-undefined error` _only_ works on cctools' ld.
This is much less noticeable than the original problem, because GCC's ld
won't complain, it just won't do the right thing. The Solaris linker, on
the other hand, _will_ complain:

    ld: fatal: file error: open failed: No such file or directory

This is a misleading error message, but what it is actually telling us
is that it can't open a file named "error", which it tries to do because
it doesn't recognise "-undefined" as an option that can take an
argument.

We can demonstrate that this doesn't have the desired effect in GCC too.
Consider this a C source file, main.c, containing the following:

    extern void hello(void);

    int main(void) {
        hello();
    }

If we compile this using the command `gcc -fPIC -shared main.c`, we
will get no indication that the `hello` function we are trying to call
has never been defined. This is for, as the GCC documentation puts it,
"historial reasons".

If we don't want this, we can pass `--no-undefined` to the linker, like
this:

    gcc -fPIC -shared -Wl,--no-undefined main.c

This is what the Makefile used to do, before being changed. Running this
command will produce an error informing us of our mistake:

    /tmp/ccGRJkJ8.o: In function `main':
    main.c:(.text+0xc): undefined reference to `hello'
    collect2: error: ld returned 1 exit status

However, trying to use the cctools' ld's equivalent reveals that GCC's
ld definitely does not interpret it the same way. This command will
succeed, just the same as the one where we specified no explicit linker
options at all. I don't want to speculate on what effect, if any,
`-undefined error` has on GCC's ld, but it definitely isn't the right
one.

After some discussion, we've decided it's best to just remove these
flags.
  • Loading branch information
alyssais authored and xzyfer committed Nov 14, 2018
1 parent 2ebf465 commit a8273fc
Showing 1 changed file with 1 addition and 2 deletions.
3 changes: 1 addition & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,7 @@ else
CXXFLAGS += -O1 -fno-omit-frame-pointer
LDFLAGS += -O1 -fno-omit-frame-pointer
endif
LDFLAGS += -Wl,-undefined,error
CAT ?= $(if $(filter $(OS),Windows_NT),type,cat)
CAT ?= $(if $(filter $(OS),Windows_NT),type,cat)

ifneq (,$(findstring /cygdrive/,$(PATH)))
UNAME := Cygwin
Expand Down

0 comments on commit a8273fc

Please sign in to comment.