Error out if shared lib links to static lib without PIC

This is only needed on Linux and BSD. So, we always unconditionally
enable self.pic for Windows and OS X.
pull/856/head
Nirbheek Chauhan 8 years ago
parent ee8b3b12a0
commit ce1393609f
  1. 8
      mesonbuild/build.py
  2. 11
      test cases/failing/33 exe static shared/meson.build
  3. 10
      test cases/failing/33 exe static shared/prog.c
  4. 16
      test cases/failing/33 exe static shared/shlib2.c
  5. 3
      test cases/failing/33 exe static shared/stat.c

@ -524,6 +524,12 @@ class BuildTarget():
raise InvalidArguments('Name suffix must be a string.')
self.suffix = name_suffix
if isinstance(self, StaticLibrary):
# You can't disable PIC on OS X. The compiler ignores -fno-PIC.
# PIC is always on for Windows (all code is position-independent
# since library loading is done differently)
if for_darwin(self.is_cross, self.environment) or for_windows(self.is_cross, self.environment):
self.pic = True
else:
self.pic = kwargs.get('pic', False)
if not isinstance(self.pic, bool):
raise InvalidArguments('Argument pic must be boolean')
@ -629,6 +635,8 @@ by calling get_variable() on the subproject object.''')
t = t.held_object
if not isinstance(t, (StaticLibrary, SharedLibrary)):
raise InvalidArguments('Link target is not library.')
if isinstance(self, SharedLibrary) and isinstance(t, StaticLibrary) and not t.pic:
raise InvalidArguments("Can't link a non-PIC static library into a shared library")
if self.is_cross != t.is_cross:
raise InvalidArguments('Tried to mix cross built and native libraries in target %s.' % self.name)
self.link_targets.append(t)

@ -0,0 +1,11 @@
project('statchain', 'c')
host_system = host_machine.system()
if host_system == 'windows' or host_system == 'darwin'
error('Test only fails on Linux and BSD')
endif
statlib = static_library('stat', 'stat.c', pic : false)
shlib2 = shared_library('shr2', 'shlib2.c', link_with : statlib)
exe = executable('prog', 'prog.c', link_with : shlib2)
test('runtest', exe)

@ -0,0 +1,10 @@
int shlibfunc2();
int statlibfunc();
int main(int argc, char **argv) {
if (statlibfunc() != 42)
return 1;
if (shlibfunc2() != 24)
return 1;
return 0;
}

@ -0,0 +1,16 @@
#if defined _WIN32 || defined __CYGWIN__
#define DLL_PUBLIC __declspec(dllexport)
#else
#if defined __GNUC__
#define DLL_PUBLIC __attribute__ ((visibility("default")))
#else
#pragma message ("Compiler does not support symbol visibility.")
#define DLL_PUBLIC
#endif
#endif
int statlibfunc(void);
int DLL_PUBLIC shlibfunc2(void) {
return 24;
}

@ -0,0 +1,3 @@
int statlibfunc() {
return 42;
}
Loading…
Cancel
Save