diff options
Diffstat (limited to 'external/cairo/ExternalProject_cairo.mk')
-rw-r--r-- | external/cairo/ExternalProject_cairo.mk | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/external/cairo/ExternalProject_cairo.mk b/external/cairo/ExternalProject_cairo.mk index 43b4a7b53b2a..41e7621c789f 100644 --- a/external/cairo/ExternalProject_cairo.mk +++ b/external/cairo/ExternalProject_cairo.mk @@ -38,6 +38,26 @@ $(call gb_ExternalProject_get_state_target,cairo,build) : else +# Including -rtlib=compiler-rt in pixman_LIBS is a BAD HACK: At least when compiling with Clang +# -fsanitize=undefined on Linux x86-64, the generated code references __muloti4, which is an +# extension provided by libclang_rt.builtins-x86_64.a runtime, but not by GCC's libgcc_s.so.1 (which +# ultimately boils down to a bug in LLVM, I would say). I am not sure whether it should in general +# work to mix uses of the (default on Linux, at least) GCC libgcc_s and LLVM's libclang_rt.builtins +# runtime libraries in one process, but for this specific case of libcairo.so it appears to work +# well: For one, the only symbol referenced by libcairo.so from the runtime library is __muloti4; +# for another, at least in my LLVM build, lib/clang/12.0.0/lib/linux/libclang_rt.builtins-x86_64.a +# is only provided as a static archive; so libcairo.so will only contain a "harmless" copy of +# __muloti4 and not have a DT_NEEDED of any libclang_rt.builtins dynamic library that it would pull +# in at runtime. +# But passing -rtlib=compiler-rt into cairo's configure via the more obvious LDFLAGS would fail at +# least when building with -fsanitize=address and -fsanitize=undefined, as then the executable +# compiled by configure when "checking whether the C compiler works" would reference +# _Unwind_Backtrace etc. that are provided by GCC's libgcc_s.so.1 but not by LLVM's +# libclang_rt.builtins-x86_64.a (and whatever the reason for that inconsistency). So +# -rtlib=compiler-rt must be passed just into the linking of libcairo.so, but not generally into +# cairo's configure. And pixman_LIBS happens to offer that. (The -Wc is necessary so that libtool +# does not throw away the -rtlib=compiler-rt which it does not understand.) + # overwrite src/cairo-version.h because that is just a dummy file and included # from cairo.h in non-overridable way @@ -54,7 +74,10 @@ $(call gb_ExternalProject_get_state_target,cairo,build) : pixman_CFLAGS="-I$(call gb_UnpackedTarball_get_dir,pixman)/pixman" \ pixman_LIBS="-L$(call gb_UnpackedTarball_get_dir,pixman)/pixman/.libs -lpixman-1 \ $(if $(filter LINUX,$(OS)),-Wl$(COMMA)-z$(COMMA)origin \ - -Wl$(COMMA)-rpath$(COMMA)\\\$$\$$ORIGIN)" \ + -Wl$(COMMA)-rpath$(COMMA)\\\$$\$$ORIGIN) \ + $(if $(filter -fsanitize=%,$(CC)), \ + $(if $(filter LINUX-X86_64-TRUE,$(OS)-$(CPUNAME)-$(COM_IS_CLANG)), \ + -Wc$(COMMA)-rtlib=compiler-rt))" \ png_REQUIRES="trick_configure_into_using_png_CFLAGS_and_LIBS" \ png_CFLAGS="$(LIBPNG_CFLAGS)" png_LIBS="$(LIBPNG_LIBS)" \ $(if $(SYSTEM_FREETYPE),,FREETYPE_CFLAGS="-I$(call gb_UnpackedTarball_get_dir,freetype)/include") \ |