https://sourceware.org/bugzilla/show_bug.cgi?id=31956

            Bug ID: 31956
           Summary: -Wl,--wrap broken with LTO?
           Product: binutils
           Version: unspecified
            Status: NEW
          Severity: normal
          Priority: P2
         Component: ld
          Assignee: unassigned at sourceware dot org
          Reporter: sam at gentoo dot org
  Target Milestone: ---

I'm not sure if this is a good reduction, we'll see.

We keep getting reports of LTO causing undefined references with gcc+bfd when
testsuites use -Wl,--wrap. I picked OpenVPN to reduce after a comment from one
of its upstream developers: https://bugs.gentoo.org/877741#c4.

argv.i:
```
void _cmocka_run_group_tests() {}
void parse_line();
void argv_parse_cmd() { parse_line(); }
```

argv_testdriver-test_argv.i:
```
struct CMUnitTest {
  void *test_func;
} _cmocka_run_group_tests();

void argv_parse_cmd();
void __wrap_parse_line() {};

void argv_parse_cmd__command_and_extra_options__argc_correct() {
  argv_parse_cmd();
}

struct CMUnitTest main_tests = {
    argv_parse_cmd__command_and_extra_options__argc_correct
};

int main() { _cmocka_run_group_tests(main_tests); }
```

```
$ gcc argv_testdriver-test_argv.i argv.i -Wl,-wrap=parse_line -O3 -flto
-fuse-ld=bld # broken
/usr/lib/gcc/x86_64-pc-linux-gnu/15/../../../../x86_64-pc-linux-gnu/bin/ld.bfd:
/tmp/ccjmsCeq.ltrans0.ltrans.o: in function
`argv_parse_cmd__command_and_extra_options__argc_correct':
<artificial>:(.text+0x13): undefined reference to `__wrap_parse_line'

$ gcc argv_testdriver-test_argv.i argv.i -Wl,-wrap=parse_line -O3 -flto
-fuse-ld=mold # fine

$ clang argv_testdriver-test_argv.i argv.i -Wl,-wrap=parse_line -O3 -flto
-fuse-ld=mold # fine
argv_testdriver-test_argv.i:16:37: warning: passing arguments to
'_cmocka_run_group_tests' without a prototype is deprecated in all versions of
C and is not supported in C23 [-Wdeprecated-non-prototype]
   16 | int main() { _cmocka_run_group_tests(main_tests); }
      |                                     ^
1 warning generated.

$ clang argv_testdriver-test_argv.i argv.i -Wl,-wrap=parse_line -O3 -flto
-fuse-ld=lld # fine
argv_testdriver-test_argv.i:16:37: warning: passing arguments to
'_cmocka_run_group_tests' without a prototype is deprecated in all versions of
C and is not supported in C23 [-Wdeprecated-non-prototype]
   16 | int main() { _cmocka_run_group_tests(main_tests); }
      |                                     ^
1 warning generated.
```

-- 
You are receiving this mail because:
You are on the CC list for the bug.

Reply via email to