http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55142
--- Comment #3 from H.J. Lu <hjl.tools at gmail dot com> 2012-10-31 09:13:46 UTC --- The code looks like: while (dyn->d_tag != 0) { if ((d_tag_utype) dyn->d_tag < 34) info[dyn->d_tag] = dyn; else if (dyn->d_tag >= 0x70000000 && dyn->d_tag < 0x70000000 + 0) info[dyn->d_tag - 0x70000000 + 34] = dyn; else if ((d_tag_utype) (0x6fffffff - (dyn->d_tag)) < 16) info[(34 + 0 + (0x6fffffff - (dyn->d_tag)))] = dyn; else if ((d_tag_utype) ((Elf32_Word)-((Elf32_Sword) (dyn->d_tag) <<1>>1)-1) < 3) info[((Elf32_Word)-((Elf32_Sword) (dyn->d_tag) <<1>>1)-1) + 34 + 0 + 16] = dyn; else if ((d_tag_utype) (0x6ffffdff - (dyn->d_tag)) < 12) info[(0x6ffffdff - (dyn->d_tag)) + 34 + 0 + 16 + 3] = dyn; else if ((d_tag_utype) (0x6ffffeff - (dyn->d_tag)) < 11) info[(0x6ffffeff - (dyn->d_tag)) + 34 + 0 + 16 + 3 + 12] = dyn; ++dyn; }