Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3a26eefd authored by Dan Willemsen's avatar Dan Willemsen
Browse files

Apply system_shared_libs to static libraries

Even though we aren't doing any linking for static libraries, the
default libraries (libc, libm, libdl) are now exporting headers, so we
should be using those for both static and shared libraries (especially
when re-using objects between the two). Without this we've been in a
state where a cc_library will compile differently than a
cc_library_shared, as we'd re-use the compilation units from the static
variant in the shared library.

This does require marking many of libc's dependencies as not using libc
with system_shared_libs, otherwise we run into dependency loops.

Test: treehugger
Change-Id: Ie42edc5184f315f998db953594e425214b810e0e
parent 5b46a085
Loading
Loading
Loading
Loading
+32 −9
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ type LibraryProperties struct {
		Whole_static_libs  []string `android:"arch_variant"`
		Static_libs        []string `android:"arch_variant"`
		Shared_libs        []string `android:"arch_variant"`
		System_shared_libs []string `android:"arch_variant"`
	} `android:"arch_variant"`
	Shared struct {
		Srcs   []string `android:"arch_variant"`
@@ -45,6 +46,7 @@ type LibraryProperties struct {
		Whole_static_libs  []string `android:"arch_variant"`
		Static_libs        []string `android:"arch_variant"`
		Shared_libs        []string `android:"arch_variant"`
		System_shared_libs []string `android:"arch_variant"`
	} `android:"arch_variant"`

	// local file name to pass to the linker as -unexported_symbols_list
@@ -488,6 +490,16 @@ func (library *libraryDecorator) linkerInit(ctx BaseModuleContext) {
}

func (library *libraryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps {
	if library.static() {
		if library.Properties.Static.System_shared_libs != nil {
			library.baseLinker.Properties.System_shared_libs = library.Properties.Static.System_shared_libs
		}
	} else if library.shared() {
		if library.Properties.Shared.System_shared_libs != nil {
			library.baseLinker.Properties.System_shared_libs = library.Properties.Shared.System_shared_libs
		}
	}

	deps = library.baseLinker.linkerDeps(ctx, deps)

	if library.static() {
@@ -921,8 +933,19 @@ func NewLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator)
func reuseStaticLibrary(mctx android.BottomUpMutatorContext, static, shared *Module) {
	if staticCompiler, ok := static.compiler.(*libraryDecorator); ok {
		sharedCompiler := shared.compiler.(*libraryDecorator)

		// Check libraries in addition to cflags, since libraries may be exporting different
		// include directories.
		if len(staticCompiler.Properties.Static.Cflags) == 0 &&
			len(sharedCompiler.Properties.Shared.Cflags) == 0 {
			len(sharedCompiler.Properties.Shared.Cflags) == 0 &&
			len(staticCompiler.Properties.Static.Whole_static_libs) == 0 &&
			len(sharedCompiler.Properties.Shared.Whole_static_libs) == 0 &&
			len(staticCompiler.Properties.Static.Static_libs) == 0 &&
			len(sharedCompiler.Properties.Shared.Static_libs) == 0 &&
			len(staticCompiler.Properties.Static.Shared_libs) == 0 &&
			len(sharedCompiler.Properties.Shared.Shared_libs) == 0 &&
			staticCompiler.Properties.Static.System_shared_libs == nil &&
			sharedCompiler.Properties.Shared.System_shared_libs == nil {

			mctx.AddInterVariantDependency(reuseObjTag, shared, static)
			sharedCompiler.baseCompiler.Properties.OriginalSrcs =
+24 −25
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ type BaseLinkerProperties struct {
	// list of system libraries that will be dynamically linked to
	// shared library and executable modules.  If unset, generally defaults to libc,
	// libm, and libdl.  Set to [] to prevent linking against the defaults.
	System_shared_libs []string
	System_shared_libs []string `android:"arch_variant"`

	// allow the module to contain undefined symbols.  By default,
	// modules cannot contain undefined symbols that are not satisified by their immediate
@@ -237,8 +237,10 @@ func (linker *baseLinker) linkerDeps(ctx DepsContext, deps Deps) Deps {
			deps.LateStaticLibs = append(deps.LateStaticLibs, "libgcc")
		}

		if !ctx.static() {
			systemSharedLibs := linker.Properties.System_shared_libs
		var systemSharedLibs []string
		if !ctx.useSdk() && !ctx.useVndk() {
			systemSharedLibs = linker.Properties.System_shared_libs
		}
		if systemSharedLibs == nil {
			systemSharedLibs = []string{"libc", "libm", "libdl"}
		}
@@ -255,7 +257,7 @@ func (linker *baseLinker) linkerDeps(ctx DepsContext, deps Deps) Deps {
			}
		}

			// If libc and libdl are both in system_shared_libs make sure libd comes after libc
		// If libc and libdl are both in system_shared_libs make sure libdl comes after libc
		// to avoid loading libdl before libc.
		if inList("libdl", systemSharedLibs) && inList("libc", systemSharedLibs) &&
			indexList("libdl", systemSharedLibs) < indexList("libc", systemSharedLibs) {
@@ -263,9 +265,6 @@ func (linker *baseLinker) linkerDeps(ctx DepsContext, deps Deps) Deps {
		}

		deps.LateSharedLibs = append(deps.LateSharedLibs, systemSharedLibs...)
		} else if ctx.useSdk() || ctx.useVndk() {
			deps.LateSharedLibs = append(deps.LateSharedLibs, "libc", "libm", "libdl")
		}
	}

	if ctx.Windows() {