Another GLIBC build error with GCC6
Commit Message
Steve Ellcey wrote:
> I can't seem to find it in my email, can you send it again?
One must read Andreas's messages carefully. You could try the attached
(untested) patch, which implements his suggestion.
Comments
On Wed, 2015-07-22 at 10:03 -0700, Paul Eggert wrote:
> Steve Ellcey wrote:
> > I can't seem to find it in my email, can you send it again?
>
> One must read Andreas's messages carefully. You could try the attached
> (untested) patch, which implements his suggestion.
That seems to work fine for elf/dl-deps.c where we use DT_EXTRATAGIDX
with arguments of either DT_AUXILIARY or DT_FILTER but I see this
macro is also used in elf/get-dynamic-info.h, do we know what values
it may be given there because the macro isn't going to result in the
same results for all inputs.
Steve Ellcey
sellcey@imgtec.com
Steve Ellcey wrote:
> the macro isn't going to result in the
> same results for all inputs.
Why not? For which input would the patch change behavior? I don't see how it
could happen. The same pattern already works for DT_VERSIONTAGIDX and for
DT_VALTAGIDX, which suggests it shouldn't be a problem for DT_EXTRATAGIDX.
On Wed, 2015-07-22 at 13:39 -0700, Paul Eggert wrote:
> Steve Ellcey wrote:
> > the macro isn't going to result in the
> > same results for all inputs.
>
> Why not? For which input would the patch change behavior? I don't see how it
> could happen. The same pattern already works for DT_VERSIONTAGIDX and for
> DT_VALTAGIDX, which suggests it shouldn't be a problem for DT_EXTRATAGIDX.
It looks like it works for any value where the most significant bit is
set to 1. Otherwise it gives a different value. I don't know if we can
count on that bit always being set or not.
Steve Ellcey
#include <stdint.h>
#include <stdio.h>
typedef uint32_t Elf32_Word;
typedef int32_t Elf32_Sword;
#define DT_AUXILIARY 0x7ffffffd
#define DT_FILTER 0x7fffffff
#define DT_EXTRATAGIDX_OLD(tag) ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1)
#define DT_EXTRATAGIDX_NEW(tag) ((Elf32_Sword) (DT_FILTER - (tag)))
inputs[] = {DT_AUXILIARY, DT_FILTER, 0x70000000, 0x70001000, 0x7fffff00,
0, 1, 99, 100000, -1, -99, -100000};
int main()
{
int i;
for (i = 0; i < sizeof(inputs)/sizeof(int); i++)
printf("%d %d %d\n", inputs[i], DT_EXTRATAGIDX_OLD(inputs[i]), DT_EXTRATAGIDX
_NEW(inputs[i]));
}
% gcc x.c -o x
% ./x
2147483645 2 2
2147483647 0 0
1879048192 268435455 268435455
1879052288 268431359 268431359
2147483392 255 255
0 -1 2147483647
1 -2 2147483646
99 -100 2147483548
100000 -100001 2147383647
-1 0 -2147483648
-99 98 -2147483550
-100000 99999 -2147383649
> It looks like it works for any value where the most significant bit is
> set to 1. Otherwise it gives a different value. I don't know if we can
> count on that bit always being set or not.
DT_EXTRATAGIDX will only ever be used with the values near DT_FILTER. To
follow the other existing models, elf.h should define DT_EXTRARNGLO (same
value as DT_AUXILIARY) and DT_EXTRARNGHI (same value as DT_FILTER) and:
#define DT_EXTRATAGIDX(tag) (DT_EXTRARNGHI - (tag)) /* Reverse order! */
DT_VERSIONRNGLO and DT_VERSIONRNGHI are missing too, though
DT_VERSIONTAGIDX is already defined using the same value that
DT_VERSIONRNGHI should have.
From 6b661c83b411fe5b020c3523ca6cbd29fc63b2b7 Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Wed, 22 Jul 2015 10:00:28 -0700
Subject: [PATCH] Port DT_EXTRATAGIDX to GCC 6.
See Steve Ellcey's bug report in:
https://sourceware.org/ml/libc-alpha/2015-07/msg00690.html
* elf/elf.h (DT_EXTRATAGIDX): Simplify by rewriting it the
same way as DT_VERSIONTAGIDX. Suggested by Andreas Schwab in:
https://sourceware.org/ml/libc-alpha/2015-07/msg00702.html
---
ChangeLog | 9 +++++++++
elf/elf.h | 2 +-
2 files changed, 10 insertions(+), 1 deletion(-)
@@ -1,3 +1,12 @@
+2015-07-22 Paul Eggert <eggert@cs.ucla.edu>
+
+ Port DT_EXTRATAGIDX to GCC 6.
+ See Steve Ellcey's bug report in:
+ https://sourceware.org/ml/libc-alpha/2015-07/msg00690.html
+ * elf/elf.h (DT_EXTRATAGIDX): Simplify by rewriting it the
+ same way as DT_VERSIONTAGIDX. Suggested by Andreas Schwab in:
+ https://sourceware.org/ml/libc-alpha/2015-07/msg00702.html
+
2015-07-21 Paul Eggert <eggert@cs.ucla.edu>
Port the 0x7efe...feff pattern to GCC 6.
@@ -801,7 +801,7 @@ typedef struct
range. Be compatible. */
#define DT_AUXILIARY 0x7ffffffd /* Shared object to load before self */
#define DT_FILTER 0x7fffffff /* Shared object to get values from */
-#define DT_EXTRATAGIDX(tag) ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1)
+#define DT_EXTRATAGIDX(tag) (DT_FILTER - (tag)) /* Reverse order! */
#define DT_EXTRANUM 3
/* Values of `d_un.d_val' in the DT_FLAGS entry. */
--
2.1.0