https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120515

            Bug ID: 120515
           Summary: darwin warning: ld: warning: -U option is redundant
                    when using -undefined dynamic_lookup
           Product: gcc
           Version: 15.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: driver
          Assignee: unassigned at gcc dot gnu.org
          Reporter: peter at eisentraut dot org
  Target Milestone: ---

I'm getting an undesirable linker warning when using gcc on macOS Homebrew.  (I
know this is heavily patched, but my best guess is that this is an upstream
issue, see below.)

gcc-15 (Homebrew GCC 15.1.0) 15.1.0

Consider a simple source file test.c:

```
int foo(int x)
{
        return x;
}
```

and also test.exports:

```
_foo
```

Compile:

gcc-15 -c -o test.o test.c

Link:

gcc-15 -o test.dylib -bundle test.o -Wl,-undefined,dynamic_lookup
-Wl,-exported_symbols_list,test.exports

This shows this warning:

ld: warning: -U option is redundant when using -undefined dynamic_lookup

Using -v shows what is being called underneath:

gcc-15 -v -o test.dylib -bundle test.o -Wl,-undefined,dynamic_lookup
-Wl,-exported_symbols_list,test.exports


/opt/homebrew/Cellar/gcc/15.1.0/bin/../libexec/gcc/aarch64-apple-darwin24/15/collect2
-demangle -syslibroot /Library/Developer/CommandLineTools/SDKs/MacOSX15.sdk/
-dynamic -arch arm64 -macos_version_min 15.0.0 -o test.dylib
-L/opt/homebrew/Cellar/gcc/15.1.0/bin/../lib/gcc/current/gcc/aarch64-apple-darwin24/15
-L/opt/homebrew/Cellar/gcc/15.1.0/bin/../lib/gcc/current/gcc
-L/opt/homebrew/Cellar/gcc/15.1.0/bin/../lib/gcc/current/gcc/aarch64-apple-darwin24/15/../../..
-lemutls_w -lheapt_w test.o -undefined dynamic_lookup -exported_symbols_list
test.exports -bundle -lgcc -lSystem -U ___emutls_get_address -exported_symbol
___emutls_get_address -U ___emutls_register_common -exported_symbol
___emutls_register_common -U ___gcc_nested_func_ptr_created -exported_symbol
___gcc_nested_func_ptr_created -U ___gcc_nested_func_ptr_deleted
-exported_symbol ___gcc_nested_func_ptr_deleted -no_compact_unwind -rpath
@loader_path -rpath
/opt/homebrew/Cellar/gcc/15.1.0/lib/gcc/current/gcc/aarch64-apple-darwin24/15
-rpath /opt/homebrew/Cellar/gcc/15.1.0/lib/gcc/current/gcc -rpath
/opt/homebrew/Cellar/gcc/15.1.0/lib/gcc/current

So these internally added -U options should perhaps be skipped if -undefined
dynamic_lookup is used?

FWIW, documentation for these options:

     -U symbol_name
             Specified that it is ok for symbol_name to have no definition.
[...]

     -undefined treatment
             Specifies how undefined symbols are to be treated. Options are:
error, warning, suppress, or dynamic_lookup.  The default is error. [...]

These -U options appear to come from gcc/config/darwin.h, but I don't dare
analyze what is going on in that file. ;-)  Apparently, -exported_symbols_list
is necessary to trigger it; without it there is no warning.

I can reproduce this back to gcc-13 at least.  That darwin.h file doesn't
appear to have changed in this respect.

Reply via email to