https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99896
Bug ID: 99896
Summary: g++ drops -lc
Product: gcc
Version: 10.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: driver
Assignee: unassigned at gcc dot gnu.org
Reporter: vries at gcc dot gnu.org
Target Milestone: ---
[ Spinoff from gdb PR https://sourceware.org/bugzilla/show_bug.cgi?id=27681 . ]
Consider the following test-case, consisting of:
...
$ cat main.c
#include <assert.h>
#include <stddef.h>
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <regex.h>
extern void foo (void);
int
main (void)
{
regex_t re;
int res = regcomp (&re, "bla", 0);
assert (res == 0);
int res2 = regexec (&re, "bla", 0, NULL, 0);
assert (res2 == 0);
regoff_t res3 = re_search (&re, "bla", 3, 0, 3, NULL);
assert (res3 == 0);
foo ();
return 0;
}
...
and:
...
$ cat foo.c
#include <assert.h>
#include <stddef.h>
#include <pcre2posix.h>
extern void foo (void);
void
foo (void)
{
regex_t re;
int res = pcre2_regcomp (&re, "bla", 0);
assert (res == 0);
int res2 = pcre2_regexec (&re, "bla", 0, NULL, 0);
assert (res2 == 0);
}
...
We can compile with gcc and run like this:
...
$ gcc main.c -lc foo.c -lpcre2-posix
$ ./a.out
$
...
likewise, with clang:
...
$ clang main.c -lc foo.c -lpcre2-posix
$ ./a.out
$
...
likewise, with clang++:
...
$ clang++ -x c++ main.c -lc foo.c -lpcre2-posix
$ ./a.out
$
...
but with g++:
...
$ g++ -x c++ main.c -lc foo.c -lpcre2-posix
$ ./a.out
Segmentation fault (core dumped)
$
...
Using -v, we can see what goes wrong. With gcc, we have:
...
collect2 ... main.o -lc foo.o -lpcre2-posix ...
...
With g++, we have instead:
...
collect2 ... main.o foo.o -lpcre2-posix ...
...
Workaround: use -Wl:
...
$ g++ -x c++ main.c -Wl,-lc foo.c -lpcre2-posix
$ ./a.out
$
...