diff options
author | Brooks Moses <bmoses@google.com> | 2013-10-03 10:38:14 -0700 |
---|---|---|
committer | Brooks Moses <bmoses@google.com> | 2013-10-03 10:38:14 -0700 |
commit | 5f855e3598a576c35e54623a13b256f3e87fcd4d (patch) | |
tree | ba77026f236ca40b764798e0d70001a3fcff58cd /Makerules | |
parent | b7f2d27dbd85f6a0966dc389ad4f8205085b7ae8 (diff) | |
download | glibc-5f855e3598a576c35e54623a13b256f3e87fcd4d.tar.gz glibc-5f855e3598a576c35e54623a13b256f3e87fcd4d.tar.xz glibc-5f855e3598a576c35e54623a13b256f3e87fcd4d.zip |
Fix erroneous (and circular) implied pattern rule for linkobj/libc.so.
[BZ #15915] As described in the bug, the pattern rule for lib%.so files in Makerules includes linkobj/libc.so as a dependency. However, the explicit rule for linkobj/libc.so is in the top-level Makefile. Thus, the subdirectory makefiles that include Makerules end up with an erroneous makefile pattern rule for linkobj/libc.so that includes itself as a dependency. The result is make warnings whenever rules for other .so files are resolved -- and, on occasion, actual makefile failures when a race condition causes the implicit rule to actually be used. This patch moves the explicit rules for linkobj/libc.so into Makerules to clear up this problem. It also elaborates a couple of comments that I'd initially found confusing.
Diffstat (limited to 'Makerules')
-rw-r--r-- | Makerules | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/Makerules b/Makerules index cca3f82799..92c2872612 100644 --- a/Makerules +++ b/Makerules @@ -565,16 +565,47 @@ generated += libc_pic.opts libc_pic.os.clean libc_pic_clean := .clean endif -# Do not filter ld.so out of libc.so link. +# Build a possibly-modified version of libc_pic.a for use in building +# linkobj/libc.so. +ifeq (,$(filter sunrpc,$(subdirs))) +$(common-objpfx)linkobj/libc_pic.a: $(common-objpfx)libc_pic.a + $(make-target-directory) + ln -f $< $@ +else +$(common-objpfx)linkobj/libc_pic.a: $(common-objpfx)libc_pic.a \ + $(common-objpfx)sunrpc/librpc_compat_pic.a + $(make-target-directory) + (cd $(common-objpfx)linkobj; \ + $(AR) x ../libc_pic.a; \ + rm $$($(AR) t ../sunrpc/librpc_compat_pic.a | sed 's/^compat-//'); \ + $(AR) x ../sunrpc/librpc_compat_pic.a; \ + $(AR) cr libc_pic.a *.os; \ + rm *.os) +endif # $(subdirs) contains sunrpc + +# Clear link-libc-deps for the libc.so libraries so build-shlibs does not +# filter ld.so out of the list of linked objects. $(common-objpfx)libc.so: link-libc-deps = # empty +$(common-objpfx)linkobj/libc.so: link-libc-deps = # empty -# Use our own special initializer and finalizer files for libc.so. +# Use our own special initializer and finalizer files for the libc.so +# libraries. $(common-objpfx)libc.so: $(elfobjdir)/soinit.os \ $(common-objpfx)libc_pic.os$(libc_pic_clean) \ $(elfobjdir)/sofini.os \ - $(elfobjdir)/interp.os $(elfobjdir)/ld.so \ + $(elfobjdir)/interp.os \ + $(elfobjdir)/ld.so \ + $(shlib-lds) + $(build-shlib) + +$(common-objpfx)linkobj/libc.so: $(elfobjdir)/soinit.os \ + $(common-objpfx)linkobj/libc_pic.a \ + $(elfobjdir)/sofini.os \ + $(elfobjdir)/interp.os \ + $(elfobjdir)/ld.so \ $(shlib-lds) $(build-shlib) + ifeq ($(build-shared),yes) $(common-objpfx)libc.so: $(common-objpfx)libc.map endif |