mirror of
https://github.com/rui314/mold.git
synced 2024-10-04 16:48:04 +03:00
e65c5d2a1c
GCC creates symbols in comdat groups as STB_GNU_UNIQUE instead of STB_WEAK if it was configured to do so at build time or the -fgnu-unique option was given. If mold is given two object files with and without STB_GNU_UNIQUE, it could end up selecting a sybmol that is in a de-duplicated comdat group. This is arguably just an ABI incompatibility. Two comdat groups must contain the same contents if their identifiers are the same. But we can't handle it as an error because it is not uncommon to link object files compiled using Clang (or GCC without -fgnu-unique) to static libraries built with GCC that produces STB_GNU_UNIQUE symbols. This patch gives the same priority to STB_GNU_UNIQUE as STB_WEAK so that mold won't select symbols in discarded comdat groups. Frankly, the situation around STB_GNU_UNIQUE is a mess. That GNU extension shouldn't have been added to the GNU toolchain in the first place. It looks like GCC shipped with Linux distros are nowadays do not produce STB_GNU_UNIQUE symbols by default, but we still need to handle them. Fixes https://github.com/rui314/mold/issues/324
34 lines
593 B
Bash
Executable File
34 lines
593 B
Bash
Executable File
#!/bin/bash
|
|
export LANG=
|
|
set -e
|
|
CC="${CC:-cc}"
|
|
CXX="${CXX:-c++}"
|
|
testname=$(basename "$0" .sh)
|
|
echo -n "Testing $testname ... "
|
|
cd "$(dirname "$0")"/../..
|
|
mold="$(pwd)/mold"
|
|
t=out/test/elf/$testname
|
|
mkdir -p $t
|
|
|
|
which g++ >& /dev/null || { echo skipped; exit; }
|
|
|
|
cat <<EOF | g++ -o $t/a.o -c -std=c++17 -fno-gnu-unique -xc++ -
|
|
inline int foo = 5;
|
|
int bar() { return foo; }
|
|
EOF
|
|
|
|
cat <<EOF | g++ -o $t/b.o -c -std=c++17 -fgnu-unique -xc++ -
|
|
#include <stdio.h>
|
|
|
|
inline int foo = 5;
|
|
|
|
int main() {
|
|
printf("foo=%d\n", foo);
|
|
}
|
|
EOF
|
|
|
|
$CC -B. -o $t/exe $t/a.o $t/b.o
|
|
$t/exe | grep -q 'foo=5'
|
|
|
|
echo OK
|