diff options
author | Bruce Richardson <bruce.richardson@intel.com> | 2018-06-26 11:35:23 +0100 |
---|---|---|
committer | Nirbheek Chauhan <nirbheek.chauhan@gmail.com> | 2018-06-30 11:16:03 +0000 |
commit | af546b52ca0281a595f4395425905c68ff0d21c2 (patch) | |
tree | a3b6345d569912e43b308bc7b61a5e3ed2d82211 /mesonbuild/compilers/c.py | |
parent | bde99eb6c40a9c7bc4055b0dc84a31021b7623d2 (diff) | |
download | meson-af546b52ca0281a595f4395425905c68ff0d21c2.zip meson-af546b52ca0281a595f4395425905c68ff0d21c2.tar.gz meson-af546b52ca0281a595f4395425905c68ff0d21c2.tar.bz2 |
fix find_library when cross-compiling 32-bit on 64-bit systems
When find_library is used to find dependencies, meson checks all paths for
libraries with all prefixes that could match. This means that when we are
compiling with -m32 on a 64-bit system, meson will find 64-bit libraries and
assumes that they will work. Naturally that is not the case.
The obvious fix is to do a test link against those libraries, but the extra
wrinkle here is that we need to do a "whole link" so as to test the static
libs. A check with gcc+ld on linux shows that unless there are unresolved
symbols from the main.c file, the static library is never checked so we avoid
the error from an incompatible library.
Diffstat (limited to 'mesonbuild/compilers/c.py')
-rw-r--r-- | mesonbuild/compilers/c.py | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py index da28b5d..e23f412 100644 --- a/mesonbuild/compilers/c.py +++ b/mesonbuild/compilers/c.py @@ -863,7 +863,17 @@ class CCompiler(Compiler): for suffix in suffixes: for prefix in prefixes: trial = os.path.join(d, prefix + libname + '.' + suffix) - if os.path.isfile(trial): + # as well as checking the path, we need to check compilation + # with link-whole, as static libs (.a) need to be checked + # to ensure they are the right architecture, e.g. 32bit or + # 64-bit. Just a normal test link won't work as the .a file + # doesn't seem to be checked by linker if there are no + # unresolved symbols from the main C file. + extra_link_args = self.get_link_whole_for([trial]) + extra_link_args = self.linker_to_compiler_args(extra_link_args) + if (os.path.isfile(trial) and + self.links(code, env, + extra_args=extra_link_args)): return [trial] # XXX: For OpenBSD and macOS we (may) need to search for libfoo.x.y.z.dylib return None |