This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: RFC: Don't output symbol version requirement for non-DT_NEEDED libs
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: "Carlos O'Donell" <carlos at redhat dot com>, Joseph Myers <joseph at codesourcery dot com>, Binutils <binutils at sourceware dot org>, GNU C Library <libc-alpha at sourceware dot org>
- Date: Mon, 1 Dec 2014 06:18:30 -0800
- Subject: Re: RFC: Don't output symbol version requirement for non-DT_NEEDED libs
- Authentication-results: sourceware.org; auth=none
- References: <20141127081644 dot GA20383 at bubble dot grove dot modra dot org> <54775069 dot 2090905 at redhat dot com> <alpine dot DEB dot 2 dot 10 dot 1411272358160 dot 15307 at digraph dot polyomino dot org dot uk> <5478945E dot 5010402 at redhat dot com> <20141201035048 dot GK20383 at bubble dot grove dot modra dot org>
On Sun, Nov 30, 2014 at 7:50 PM, Alan Modra <amodra@gmail.com> wrote:
> On Fri, Nov 28, 2014 at 10:27:26AM -0500, Carlos O'Donell wrote:
>> On 11/27/2014 07:06 PM, Joseph Myers wrote:
>> > Actually, I think it's a linker bug not a glibc bug. If you don't link
>> > with a library providing a symbol you use, I don't think any information
>> > at all about how it might be resolved with some library you didn't link
>> > against should be embedded in the binary: not a DT_NEEDED entry, and not a
>> > version requirement. I don't think you can presume at static link time,
>> > with a weak undefined symbol like that, "this symbol isn't needed, but if
>> > defined at runtime it must have this version" (as opposed to "this symbol
>> > isn't needed, and might have any version at runtime", which is the safe
>> > assumption).
>>
>> I had not considered it like that. I agree with your rationale.
>>
>> In which case this is clearly a bug in binutils and Alan's patch
>> is correct.
>>
>> I tried to come up with a case where this would matter, but from
>> first principles I couldn't construct any sensible test cases.
>
> If the version *does* matter, then mentioning on the command line
> the library that defines the symbol will result in both the symbol
> being versioned and the library in DT_NEEDED.
>
> I've gone ahead and committed the linker patch, to 2.25 too. Thanks
> to all who contributed to this thread.
>
I checked this testcase into master and 2.25 branch.
--
H.J.
----
>From fb389763e0ee42be2f221da60e1c126314857d11 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Mon, 1 Dec 2014 06:06:21 -0800
Subject: [PATCH] Add tests for PR ld/16452 and PR ld/16457
PR ld/16452
PR ld/16457
* ld-elf/pr16452.map: New file.
* ld-elf/pr16452.od: Likewise.
* ld-elf/pr16452a.c: Likewise.
* ld-elf/pr16452b.c: Likewise.
* ld-elf/pr16457.od: Likewise.
* ld-elf/shared.exp (build_tests): Add tests for PR ld/16452 and
PR ld/16457.
---
ld/testsuite/ChangeLog | 13 +++++++++++++
ld/testsuite/ld-elf/pr16452.map | 1 +
ld/testsuite/ld-elf/pr16452.od | 7 +++++++
ld/testsuite/ld-elf/pr16452a.c | 1 +
ld/testsuite/ld-elf/pr16452b.c | 2 ++
ld/testsuite/ld-elf/pr16457.od | 6 ++++++
ld/testsuite/ld-elf/shared.exp | 12 ++++++++++++
7 files changed, 42 insertions(+)
create mode 100644 ld/testsuite/ld-elf/pr16452.map
create mode 100644 ld/testsuite/ld-elf/pr16452.od
create mode 100644 ld/testsuite/ld-elf/pr16452a.c
create mode 100644 ld/testsuite/ld-elf/pr16452b.c
create mode 100644 ld/testsuite/ld-elf/pr16457.od
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index c87cc57..ef59947 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,16 @@
+2014-12-01 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/16452
+ PR ld/16457
+ * ld-elf/pr16452.map: New file.
+ * ld-elf/pr16452.od: Likewise.
+ * ld-elf/pr16452a.c: Likewise.
+ * ld-elf/pr16452b.c: Likewise.
+ * ld-elf/pr16457.od: Likewise.
+
+ * ld-elf/shared.exp (build_tests): Add tests for PR ld/16452 and
+ PR ld/16457.
+
2014-11-27 H.J. Lu <hongjiu.lu@intel.com>
* ld-mips-elf/got-vers-1.rd: Add symbol version string to
diff --git a/ld/testsuite/ld-elf/pr16452.map b/ld/testsuite/ld-elf/pr16452.map
new file mode 100644
index 0000000..6262600
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr16452.map
@@ -0,0 +1 @@
+FOO{global:f;};
diff --git a/ld/testsuite/ld-elf/pr16452.od b/ld/testsuite/ld-elf/pr16452.od
new file mode 100644
index 0000000..297f867
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr16452.od
@@ -0,0 +1,7 @@
+#failif
+#...
+Version References:
+#...
+ required from libpr16452a.so:
+ 0x[0-9a-f]+ 0x00 .. FOO
+#...
diff --git a/ld/testsuite/ld-elf/pr16452a.c b/ld/testsuite/ld-elf/pr16452a.c
new file mode 100644
index 0000000..c9b1784
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr16452a.c
@@ -0,0 +1 @@
+int f(void){return 0;}
diff --git a/ld/testsuite/ld-elf/pr16452b.c b/ld/testsuite/ld-elf/pr16452b.c
new file mode 100644
index 0000000..9ed2149
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr16452b.c
@@ -0,0 +1,2 @@
+int f(void) __attribute__((weak));
+int main(void){return f?f():0;}
diff --git a/ld/testsuite/ld-elf/pr16457.od b/ld/testsuite/ld-elf/pr16457.od
new file mode 100644
index 0000000..b29c4a1
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr16457.od
@@ -0,0 +1,6 @@
+#failif
+#...
+Dynamic Section:
+#...
+[ ]+NEEDED[ ]+libpr16452a.so
+#...
diff --git a/ld/testsuite/ld-elf/shared.exp b/ld/testsuite/ld-elf/shared.exp
index 00a4983..3fc1e4b 100644
--- a/ld/testsuite/ld-elf/shared.exp
+++ b/ld/testsuite/ld-elf/shared.exp
@@ -255,6 +255,18 @@ set build_tests {
{"Build libpr16496b.so"
"-shared tmpdir/pr16496b.o tmpdir/libpr16496a.so" ""
{dummy.c} {{objdump {-R} pr16496b.od}} "libpr16496b.so"}
+ {"Build libpr16452a.so"
+ "-shared -Wl,-soname,libpr16452a.so,--version-script=pr16452.map" "-fPIC"
+ {pr16452a.c} {} "libpr16452a.so"}
+ {"Build libpr16452b.so"
+ "-shared -Wl,-soname,libpr16452b.so,--no-as-needed
tmpdir/libpr16452a.so" "-fPIC"
+ {dummy.c} {} "libpr16452b.so"}
+ {"Build pr16452"
+ "tmpdir/libpr16452b.so -Wl,-rpath=tmpdir" ""
+ {pr16452b.c} {{objdump {-p} pr16452.od}} "pr16452"}
+ {"Build pr16457"
+ "tmpdir/libpr16452b.so -Wl,-rpath=tmpdir" ""
+ {pr16452b.c} {{objdump {-p} pr16457.od}} "pr16457"}
}
run_cc_link_tests $build_tests
--
1.9.3