summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Moody <daniel.moody@mongodb.com>2022-12-29 21:17:27 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-12-29 21:56:20 +0000
commit258f77aba1e7c76f7f665e6b07d83ba6978dea09 (patch)
tree736f09047417e5d84f82913b651fc7d443f98185
parent96573561ca19babfc0fa5f535c6cec095e703ebc (diff)
downloadmongo-258f77aba1e7c76f7f665e6b07d83ba6978dea09.tar.gz
SERVER-72324 switch to toolchain lld linker.
-rw-r--r--SConstruct34
-rw-r--r--etc/evergreen.yml1
-rw-r--r--etc/evergreen_yml_components/variants/ibm.yml2
-rw-r--r--etc/scons/mongodbtoolchain_v4_clang.vars6
-rw-r--r--etc/scons/mongodbtoolchain_v4_gcc.vars5
-rwxr-xr-xevergreen/crypt_run_tests.sh31
-rw-r--r--src/third_party/unwind/dist/include/libunwind-x86.h174
-rw-r--r--src/third_party/unwind/dist/src/coredump/_UCD_get_proc_name.c4
-rw-r--r--src/third_party/unwind/dist/src/elfxx.c10
-rw-r--r--src/third_party/unwind/dist/src/elfxx.h1
10 files changed, 140 insertions, 128 deletions
diff --git a/SConstruct b/SConstruct
index dba09c7927a..e6425549a61 100644
--- a/SConstruct
+++ b/SConstruct
@@ -1252,6 +1252,18 @@ env_vars.Add(
)
env_vars.Add(
+ 'LINKFLAGS_COMPILER_EXEC_PREFIX',
+ help='Specify the search path to be injected into the LINKFLAGS',
+ default="",
+)
+
+env_vars.Add(
+ 'COMPILER_EXEC_PREFIX_OPT',
+ help='Specify the option sign for compiler exec search paths.',
+ default="-B",
+)
+
+env_vars.Add(
'NINJA_BUILDDIR',
help="Location for shared Ninja state",
default="$BUILD_ROOT/ninja",
@@ -1694,6 +1706,9 @@ def CheckDevEnv(context):
return result
+env.Append(
+ LINKFLAGS=['${_concat(COMPILER_EXEC_PREFIX_OPT, LINKFLAGS_COMPILER_EXEC_PREFIX, "", __env__)}'])
+
devenv_check = Configure(
env,
help=False,
@@ -3432,22 +3447,11 @@ def doConfigure(myenv):
linker_ld = get_option('linker')
if linker_ld == 'auto':
- # lld has problems with separate debug info on some platforms. See:
- # - https://bugzilla.mozilla.org/show_bug.cgi?id=1485556
- # - https://bugzilla.mozilla.org/show_bug.cgi?id=1485556
- #
- # lld also apparently has problems with symbol resolution
- # in some esoteric configurations that apply for us when
- # using --link-model=dynamic mode, so disable lld there
- # too. See:
- # - https://bugs.llvm.org/show_bug.cgi?id=46676
- #
- # We should revisit all of these issues the next time we upgrade our clang minimum.
- if get_option('separate-debug') == 'off' and get_option('link-model') != 'dynamic':
+ if not env.TargetOSIs('darwin', 'macOS'):
if not myenv.AddToLINKFLAGSIfSupported('-fuse-ld=lld'):
- myenv.AddToLINKFLAGSIfSupported('-fuse-ld=gold')
- else:
- myenv.AddToLINKFLAGSIfSupported('-fuse-ld=gold')
+ myenv.FatalError(
+ f"The recommended linker 'lld' is not supported with the current compiler configuration, you can try the 'gold' linker with '--linker=gold'."
+ )
elif link_model.startswith("dynamic") and linker_ld == 'bfd':
# BFD is not supported due to issues with it causing warnings from some of
# the third party libraries that mongodb is linked with:
diff --git a/etc/evergreen.yml b/etc/evergreen.yml
index c3996cc4a87..ace06ff0a4d 100644
--- a/etc/evergreen.yml
+++ b/etc/evergreen.yml
@@ -2103,6 +2103,7 @@ buildvariants:
-j3
--variables-files=etc/scons/mongodbtoolchain_stable_gcc.vars
--link-model=dynamic
+ --linker=gold
resmoke_jobs_max: 2
has_packages: true
packager_script: packager_enterprise.py
diff --git a/etc/evergreen_yml_components/variants/ibm.yml b/etc/evergreen_yml_components/variants/ibm.yml
index 085d72fc96f..16a88080a24 100644
--- a/etc/evergreen_yml_components/variants/ibm.yml
+++ b/etc/evergreen_yml_components/variants/ibm.yml
@@ -98,6 +98,7 @@ buildvariants:
MONGO_DISTMOD=rhel72
-j3
--variables-files=etc/scons/mongodbtoolchain_stable_gcc.vars
+ --linker=gold
crypt_task_compile_flags: >-
SHLINKFLAGS_EXTRA="-Wl,-Bsymbolic
-Wl,--no-gnu-unique"
@@ -160,6 +161,7 @@ buildvariants:
MONGO_DISTMOD=rhel83
-j3
--variables-files=etc/scons/mongodbtoolchain_stable_gcc.vars
+ --linker=gold
crypt_task_compile_flags: >-
SHLINKFLAGS_EXTRA="-Wl,-Bsymbolic -Wl,--no-gnu-unique"
CCFLAGS="-fno-gnu-unique"
diff --git a/etc/scons/mongodbtoolchain_v4_clang.vars b/etc/scons/mongodbtoolchain_v4_clang.vars
index 51d686816d8..517ea4722b0 100644
--- a/etc/scons/mongodbtoolchain_v4_clang.vars
+++ b/etc/scons/mongodbtoolchain_v4_clang.vars
@@ -18,6 +18,12 @@ ENV = {
'PATH' : os.pathsep.join([toolchain_bindir] + default_path)
}
+
+# TODO BUILD-16594
+# This is temporary workaround so that gcc can find the LLVM lld from the toolchain
+# until we can build this into the toolchain's default search paths
+LINKFLAGS_COMPILER_EXEC_PREFIX = f'{toolchain_bindir}'
+
# Set any Variables for Tools from the toolchain here. Technically, we
# shouldn't need the full paths since SCons will find the toolchain
# ones first, but we don't want to accidentally get the system version
diff --git a/etc/scons/mongodbtoolchain_v4_gcc.vars b/etc/scons/mongodbtoolchain_v4_gcc.vars
index ee18f0d9427..91f868fe2af 100644
--- a/etc/scons/mongodbtoolchain_v4_gcc.vars
+++ b/etc/scons/mongodbtoolchain_v4_gcc.vars
@@ -18,6 +18,11 @@ ENV = {
'PATH' : os.pathsep.join([toolchain_bindir] + default_path)
}
+# TODO BUILD-16594
+# This is temporary workaround so that gcc can find the LLVM lld from the toolchain
+# until we can build this into the toolchain's default search paths
+LINKFLAGS_COMPILER_EXEC_PREFIX = f'{toolchain_bindir}'
+
# Set any Variables for Tools from the toolchain here. Technically, we
# shouldn't need the full paths since SCons will find the toolchain
# ones first, but we don't want to accidentally get the system version
diff --git a/evergreen/crypt_run_tests.sh b/evergreen/crypt_run_tests.sh
index 8267ed6fbd3..f02c5a04660 100755
--- a/evergreen/crypt_run_tests.sh
+++ b/evergreen/crypt_run_tests.sh
@@ -34,22 +34,21 @@ fi
#
echo "Running Mongo Crypt Shared Library exported symbols test"
-expect='A MONGO_CRYPT_1.0
-T mongo_crypt_v1_analyze_query
-T mongo_crypt_v1_bson_free
-T mongo_crypt_v1_get_version
-T mongo_crypt_v1_get_version_str
-T mongo_crypt_v1_lib_create
-T mongo_crypt_v1_lib_destroy
-T mongo_crypt_v1_query_analyzer_create
-T mongo_crypt_v1_query_analyzer_destroy
-T mongo_crypt_v1_status_create
-T mongo_crypt_v1_status_destroy
-T mongo_crypt_v1_status_get_code
-T mongo_crypt_v1_status_get_error
-T mongo_crypt_v1_status_get_explanation'
-
-actual="$(nm --extern-only --defined-only "$SOPATH" | awk '{ print $2, $3 }' | sort)"
+expect='mongo_crypt_v1_analyze_query@@MONGO_CRYPT_1.0
+mongo_crypt_v1_bson_free@@MONGO_CRYPT_1.0
+mongo_crypt_v1_get_version@@MONGO_CRYPT_1.0
+mongo_crypt_v1_get_version_str@@MONGO_CRYPT_1.0
+mongo_crypt_v1_lib_create@@MONGO_CRYPT_1.0
+mongo_crypt_v1_lib_destroy@@MONGO_CRYPT_1.0
+mongo_crypt_v1_query_analyzer_create@@MONGO_CRYPT_1.0
+mongo_crypt_v1_query_analyzer_destroy@@MONGO_CRYPT_1.0
+mongo_crypt_v1_status_create@@MONGO_CRYPT_1.0
+mongo_crypt_v1_status_destroy@@MONGO_CRYPT_1.0
+mongo_crypt_v1_status_get_code@@MONGO_CRYPT_1.0
+mongo_crypt_v1_status_get_error@@MONGO_CRYPT_1.0
+mongo_crypt_v1_status_get_explanation@@MONGO_CRYPT_1.0'
+
+actual="$(readelf -W --dyn-syms "$SOPATH" | awk '$5 == "GLOBAL" && $7 != "UND" && $7 != "ABS" {print $(NF)}' | sort)"
if [ "$actual" != "$expect" ]; then
echo "Error: symbols are not as expected in: $SOPATH"
diff --git a/src/third_party/unwind/dist/include/libunwind-x86.h b/src/third_party/unwind/dist/include/libunwind-x86.h
index 9b9de0549b7..542c1774908 100644
--- a/src/third_party/unwind/dist/include/libunwind-x86.h
+++ b/src/third_party/unwind/dist/include/libunwind-x86.h
@@ -30,38 +30,33 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
extern "C" {
#endif
-#include <inttypes.h>
#include <sys/types.h>
+#include <inttypes.h>
#include <ucontext.h>
-#define UNW_TARGET x86
-#define UNW_TARGET_X86 1
+#define UNW_TARGET x86
+#define UNW_TARGET_X86 1
-#define _U_TDEP_QP_TRUE 0 /* see libunwind-dynamic.h */
+#define _U_TDEP_QP_TRUE 0 /* see libunwind-dynamic.h */
/* This needs to be big enough to accommodate "struct cursor", while
leaving some slack for future expansion. Changing this value will
require recompiling all users of this library. Stack allocation is
relatively cheap and unwind-state copying is relatively rare, so we
want to err on making it rather too big than too small. */
-#define UNW_TDEP_CURSOR_LEN 127
+#define UNW_TDEP_CURSOR_LEN 127
typedef uint32_t unw_word_t;
typedef int32_t unw_sword_t;
typedef union {
- struct {
- uint8_t b[4];
- } val32;
- struct {
- uint8_t b[10];
- } val80;
- struct {
- uint8_t b[16];
- } val128;
+ struct { uint8_t b[4]; } val32;
+ struct { uint8_t b[10]; } val80;
+ struct { uint8_t b[16]; } val128;
} unw_tdep_fpreg_t;
-typedef enum {
+typedef enum
+ {
/* Note: general registers are expected to start with index 0.
This convention facilitates architecture-independent
implementation of the C++ exception handling ABI. See
@@ -77,110 +72,115 @@ typedef enum {
DWARF, but that doesn't work because the libunwind requires
that the exception argument registers be consecutive, which the
wouldn't be with the DWARF numbering. */
- UNW_X86_EAX, /* scratch (exception argument 1) */
- UNW_X86_EDX, /* scratch (exception argument 2) */
- UNW_X86_ECX, /* scratch */
- UNW_X86_EBX, /* preserved */
- UNW_X86_ESI, /* preserved */
- UNW_X86_EDI, /* preserved */
- UNW_X86_EBP, /* (optional) frame-register */
- UNW_X86_ESP, /* (optional) frame-register */
- UNW_X86_EIP, /* frame-register */
- UNW_X86_EFLAGS, /* scratch (except for "direction", which is fixed */
- UNW_X86_TRAPNO, /* scratch */
+ UNW_X86_EAX, /* scratch (exception argument 1) */
+ UNW_X86_EDX, /* scratch (exception argument 2) */
+ UNW_X86_ECX, /* scratch */
+ UNW_X86_EBX, /* preserved */
+ UNW_X86_ESI, /* preserved */
+ UNW_X86_EDI, /* preserved */
+ UNW_X86_EBP, /* (optional) frame-register */
+ UNW_X86_ESP, /* (optional) frame-register */
+ UNW_X86_EIP, /* frame-register */
+ UNW_X86_EFLAGS, /* scratch (except for "direction", which is fixed */
+ UNW_X86_TRAPNO, /* scratch */
/* MMX/stacked-fp registers */
- UNW_X86_ST0, /* fp return value */
- UNW_X86_ST1, /* scratch */
- UNW_X86_ST2, /* scratch */
- UNW_X86_ST3, /* scratch */
- UNW_X86_ST4, /* scratch */
- UNW_X86_ST5, /* scratch */
- UNW_X86_ST6, /* scratch */
- UNW_X86_ST7, /* scratch */
-
- UNW_X86_FCW, /* scratch */
- UNW_X86_FSW, /* scratch */
- UNW_X86_FTW, /* scratch */
- UNW_X86_FOP, /* scratch */
- UNW_X86_FCS, /* scratch */
- UNW_X86_FIP, /* scratch */
- UNW_X86_FEA, /* scratch */
- UNW_X86_FDS, /* scratch */
+ UNW_X86_ST0, /* fp return value */
+ UNW_X86_ST1, /* scratch */
+ UNW_X86_ST2, /* scratch */
+ UNW_X86_ST3, /* scratch */
+ UNW_X86_ST4, /* scratch */
+ UNW_X86_ST5, /* scratch */
+ UNW_X86_ST6, /* scratch */
+ UNW_X86_ST7, /* scratch */
+
+ UNW_X86_FCW, /* scratch */
+ UNW_X86_FSW, /* scratch */
+ UNW_X86_FTW, /* scratch */
+ UNW_X86_FOP, /* scratch */
+ UNW_X86_FCS, /* scratch */
+ UNW_X86_FIP, /* scratch */
+ UNW_X86_FEA, /* scratch */
+ UNW_X86_FDS, /* scratch */
/* SSE registers */
- UNW_X86_XMM0_lo, /* scratch */
- UNW_X86_XMM0_hi, /* scratch */
- UNW_X86_XMM1_lo, /* scratch */
- UNW_X86_XMM1_hi, /* scratch */
- UNW_X86_XMM2_lo, /* scratch */
- UNW_X86_XMM2_hi, /* scratch */
- UNW_X86_XMM3_lo, /* scratch */
- UNW_X86_XMM3_hi, /* scratch */
- UNW_X86_XMM4_lo, /* scratch */
- UNW_X86_XMM4_hi, /* scratch */
- UNW_X86_XMM5_lo, /* scratch */
- UNW_X86_XMM5_hi, /* scratch */
- UNW_X86_XMM6_lo, /* scratch */
- UNW_X86_XMM6_hi, /* scratch */
- UNW_X86_XMM7_lo, /* scratch */
- UNW_X86_XMM7_hi, /* scratch */
-
- UNW_X86_MXCSR, /* scratch */
+ UNW_X86_XMM0_lo, /* scratch */
+ UNW_X86_XMM0_hi, /* scratch */
+ UNW_X86_XMM1_lo, /* scratch */
+ UNW_X86_XMM1_hi, /* scratch */
+ UNW_X86_XMM2_lo, /* scratch */
+ UNW_X86_XMM2_hi, /* scratch */
+ UNW_X86_XMM3_lo, /* scratch */
+ UNW_X86_XMM3_hi, /* scratch */
+ UNW_X86_XMM4_lo, /* scratch */
+ UNW_X86_XMM4_hi, /* scratch */
+ UNW_X86_XMM5_lo, /* scratch */
+ UNW_X86_XMM5_hi, /* scratch */
+ UNW_X86_XMM6_lo, /* scratch */
+ UNW_X86_XMM6_hi, /* scratch */
+ UNW_X86_XMM7_lo, /* scratch */
+ UNW_X86_XMM7_hi, /* scratch */
+
+ UNW_X86_MXCSR, /* scratch */
/* segment registers */
- UNW_X86_GS, /* special */
- UNW_X86_FS, /* special */
- UNW_X86_ES, /* special */
- UNW_X86_DS, /* special */
- UNW_X86_SS, /* special */
- UNW_X86_CS, /* special */
- UNW_X86_TSS, /* special */
- UNW_X86_LDT, /* special */
+ UNW_X86_GS, /* special */
+ UNW_X86_FS, /* special */
+ UNW_X86_ES, /* special */
+ UNW_X86_DS, /* special */
+ UNW_X86_SS, /* special */
+ UNW_X86_CS, /* special */
+ UNW_X86_TSS, /* special */
+ UNW_X86_LDT, /* special */
/* frame info (read-only) */
UNW_X86_CFA,
- UNW_X86_XMM0, /* scratch */
- UNW_X86_XMM1, /* scratch */
- UNW_X86_XMM2, /* scratch */
- UNW_X86_XMM3, /* scratch */
- UNW_X86_XMM4, /* scratch */
- UNW_X86_XMM5, /* scratch */
- UNW_X86_XMM6, /* scratch */
- UNW_X86_XMM7, /* scratch */
+ UNW_X86_XMM0, /* scratch */
+ UNW_X86_XMM1, /* scratch */
+ UNW_X86_XMM2, /* scratch */
+ UNW_X86_XMM3, /* scratch */
+ UNW_X86_XMM4, /* scratch */
+ UNW_X86_XMM5, /* scratch */
+ UNW_X86_XMM6, /* scratch */
+ UNW_X86_XMM7, /* scratch */
UNW_TDEP_LAST_REG = UNW_X86_XMM7,
UNW_TDEP_IP = UNW_X86_EIP,
UNW_TDEP_SP = UNW_X86_ESP,
UNW_TDEP_EH = UNW_X86_EAX
-} x86_regnum_t;
+ }
+x86_regnum_t;
-#define UNW_TDEP_NUM_EH_REGS 2 /* eax and edx are exception args */
+#define UNW_TDEP_NUM_EH_REGS 2 /* eax and edx are exception args */
-typedef struct unw_tdep_save_loc {
+typedef struct unw_tdep_save_loc
+ {
/* Additional target-dependent info on a save location. */
char unused;
-} unw_tdep_save_loc_t;
+ }
+unw_tdep_save_loc_t;
/* On x86, we can directly use ucontext_t as the unwind context. */
typedef ucontext_t unw_tdep_context_t;
#include "libunwind-dynamic.h"
-typedef struct {
+typedef struct
+ {
/* no x86-specific auxiliary proc-info */
char unused;
-} unw_tdep_proc_info_t;
+ }
+unw_tdep_proc_info_t;
#include "libunwind-common.h"
-#define unw_tdep_getcontext UNW_ARCH_OBJ(getcontext)
-extern int unw_tdep_getcontext(unw_tdep_context_t*);
+#define unw_tdep_getcontext UNW_ARCH_OBJ(getcontext)
+extern int unw_tdep_getcontext (unw_tdep_context_t *);
-#define unw_tdep_is_fpreg UNW_ARCH_OBJ(is_fpreg)
-extern int unw_tdep_is_fpreg(int);
+#define unw_tdep_is_fpreg UNW_ARCH_OBJ(is_fpreg)
+extern int unw_tdep_is_fpreg (int);
#if defined(__cplusplus) || defined(c_plusplus)
}
diff --git a/src/third_party/unwind/dist/src/coredump/_UCD_get_proc_name.c b/src/third_party/unwind/dist/src/coredump/_UCD_get_proc_name.c
index cd5ee892232..451e29ef33a 100644
--- a/src/third_party/unwind/dist/src/coredump/_UCD_get_proc_name.c
+++ b/src/third_party/unwind/dist/src/coredump/_UCD_get_proc_name.c
@@ -50,10 +50,8 @@ elf_w (CD_get_proc_name) (struct UCD_info *ui, unw_addr_space_t as, unw_word_t i
/* segbase: where it is mapped in virtual memory */
/* mapoff: offset in the file */
segbase = cphdr->p_vaddr;
- /*mapoff = phdr->p_offset; WRONG! phdr->p_offset is the offset in COREDUMP file */
- mapoff = 0;
- ret = elf_w (get_proc_name_in_image) (as, &ui->edi.ei, segbase, mapoff, ip, buf, buf_len, offp);
+ ret = elf_w (get_proc_name_in_image) (as, &ui->edi.ei, segbase, ip, buf, buf_len, offp);
return ret;
}
diff --git a/src/third_party/unwind/dist/src/elfxx.c b/src/third_party/unwind/dist/src/elfxx.c
index 321cfb979b7..c9c6f6967ec 100644
--- a/src/third_party/unwind/dist/src/elfxx.c
+++ b/src/third_party/unwind/dist/src/elfxx.c
@@ -158,8 +158,7 @@ elf_w (lookup_symbol) (unw_addr_space_t as,
}
static Elf_W (Addr)
-elf_w (get_load_offset) (struct elf_image *ei, unsigned long segbase,
- unsigned long mapoff)
+elf_w (get_load_offset) (struct elf_image *ei, unsigned long segbase)
{
Elf_W (Addr) offset = 0;
Elf_W (Ehdr) *ehdr;
@@ -175,7 +174,7 @@ elf_w (get_load_offset) (struct elf_image *ei, unsigned long segbase,
phdr = (Elf_W (Phdr) *) ((char *) ei->image + ehdr->e_phoff);
for (i = 0; i < ehdr->e_phnum; ++i)
- if (phdr[i].p_type == PT_LOAD && (phdr[i].p_offset & pagesize_alignment_mask) == mapoff)
+ if (phdr[i].p_type == PT_LOAD && phdr[i].p_flags & PF_X)
{
offset = segbase - phdr[i].p_vaddr + (phdr[i].p_offset & (~pagesize_alignment_mask));
break;
@@ -276,7 +275,6 @@ elf_w (extract_minidebuginfo) (struct elf_image *ei, struct elf_image *mdi)
HIDDEN int
elf_w (get_proc_name_in_image) (unw_addr_space_t as, struct elf_image *ei,
unsigned long segbase,
- unsigned long mapoff,
unw_word_t ip,
char *buf, size_t buf_len, unw_word_t *offp)
{
@@ -284,7 +282,7 @@ elf_w (get_proc_name_in_image) (unw_addr_space_t as, struct elf_image *ei,
Elf_W (Addr) min_dist = ~(Elf_W (Addr))0;
int ret;
- load_offset = elf_w (get_load_offset) (ei, segbase, mapoff);
+ load_offset = elf_w (get_load_offset) (ei, segbase);
ret = elf_w (lookup_symbol) (as, ip, ei, load_offset, buf, buf_len, &min_dist);
/* If the ELF image has MiniDebugInfo embedded in it, look up the symbol in
@@ -328,7 +326,7 @@ elf_w (get_proc_name) (unw_addr_space_t as, pid_t pid, unw_word_t ip,
if (ret < 0)
return ret;
- ret = elf_w (get_proc_name_in_image) (as, &ei, segbase, mapoff, ip, buf, buf_len, offp);
+ ret = elf_w (get_proc_name_in_image) (as, &ei, segbase, ip, buf, buf_len, offp);
munmap (ei.image, ei.size);
ei.image = NULL;
diff --git a/src/third_party/unwind/dist/src/elfxx.h b/src/third_party/unwind/dist/src/elfxx.h
index fe5fcbcdfd4..cd36eb42451 100644
--- a/src/third_party/unwind/dist/src/elfxx.h
+++ b/src/third_party/unwind/dist/src/elfxx.h
@@ -50,7 +50,6 @@ extern int elf_w (get_proc_name) (unw_addr_space_t as,
extern int elf_w (get_proc_name_in_image) (unw_addr_space_t as,
struct elf_image *ei,
unsigned long segbase,
- unsigned long mapoff,
unw_word_t ip,
char *buf, size_t buf_len, unw_word_t *offp);