1 2005-11-26 Jakub Bogusz <qboosh at pld-linux dot org>
3 * src/elflint.c (valid_e_machine) Add EM_ALPHA to valid machines.
4 (check_hash): Support hash bucket size of 8 on alpha and s390x.
5 (check_sections): Support arch-specific section flags.
6 * libelf/elf32_getshdr.c: Fix assert condition; handle unaligned
7 section header with same endianess properly.
9 --- elfutils-0.116/src/elflint.c.orig 2005-11-26 10:28:00.000000000 +0100
10 +++ elfutils-0.116/src/elflint.c 2005-11-26 14:01:18.000000000 +0100
12 EM_68HC16, EM_68HC11, EM_68HC08, EM_68HC05, EM_SVX, EM_ST19, EM_VAX,
13 EM_CRIS, EM_JAVELIN, EM_FIREPATH, EM_ZSP, EM_MMIX, EM_HUANY, EM_PRISM,
14 EM_AVR, EM_FR30, EM_D10V, EM_D30V, EM_V850, EM_M32R, EM_MN10300,
15 - EM_MN10200, EM_PJ, EM_OPENRISC, EM_ARC_A5, EM_XTENSA
16 + EM_MN10200, EM_PJ, EM_OPENRISC, EM_ARC_A5, EM_XTENSA, EM_ALPHA
18 #define nvalid_e_machine \
19 (sizeof (valid_e_machine) / sizeof (valid_e_machine[0]))
20 @@ -1664,6 +1664,16 @@
21 section [%2d] '%s': hash table not for dynamic symbol table\n"),
22 idx, section_name (ebl, idx));
25 + (ehdr->e_machine == EM_ALPHA) ||
26 + ((ehdr->e_machine == EM_S390) && (ehdr->e_ident[EI_CLASS] == ELFCLASS64));
29 + if (shdr->sh_entsize != 8) /* alpha and s390x use non-standard hash bucket size of 8 */
31 +section [%2d] '%s': entry size is not 8\n"),
32 + idx, section_name (ebl, idx));
34 if (shdr->sh_entsize != sizeof (Elf32_Word))
36 section [%2d] '%s': entry size does not match Elf32_Word\n"),
37 @@ -1681,8 +1691,15 @@
41 - Elf32_Word nbucket = ((Elf32_Word *) data->d_buf)[0];
42 - Elf32_Word nchain = ((Elf32_Word *) data->d_buf)[1];
43 + uint64_t nbucket, nchain;
46 + nbucket = ((Elf64_Xword *) data->d_buf)[0];
47 + nchain = ((Elf64_Xword *) data->d_buf)[1];
49 + nbucket = ((Elf32_Word *) data->d_buf)[0];
50 + nchain = ((Elf32_Word *) data->d_buf)[1];
53 if (shdr->sh_size < (2 + nbucket + nchain) * shdr->sh_entsize)
55 @@ -1694,29 +1711,41 @@
57 size_t symsize = symshdr->sh_size / symshdr->sh_entsize;
59 - Elf32_Word *buf, *end;
63 if (nchain < symshdr->sh_size / symshdr->sh_entsize)
64 ERROR (gettext ("section [%2d] '%s': chain array not large enough\n"),
65 idx, section_name (ebl, idx));
68 + buf = ((Elf64_Xword *) data->d_buf) + 2;
69 + end = (Elf64_Xword *) ((char *) data->d_buf + shdr->sh_size);
71 buf = ((Elf32_Word *) data->d_buf) + 2;
72 end = (Elf32_Word *) ((char *) data->d_buf + shdr->sh_size);
73 - for (cnt = 2; cnt < 2 + nbucket; ++cnt)
75 + for (cnt = 2; cnt < 2 + nbucket; ++cnt) {
78 - else if (*buf++ >= symsize)
79 + val = bighash ? *(Elf64_Xword *)buf : *(Elf32_Word *)buf;
82 section [%2d] '%s': hash bucket reference %zu out of bounds\n"),
83 idx, section_name (ebl, idx), cnt - 2);
84 + buf += bighash ? 8 : sizeof(Elf32_Word);
87 - for (; cnt < 2 + nbucket + nchain; ++cnt)
88 + for (; cnt < 2 + nbucket + nchain; ++cnt) {
91 - else if (*buf++ >= symsize)
92 + val = bighash ? *(Elf64_Xword *)buf : *(Elf32_Word *)buf;
95 section [%2d] '%s': hash chain reference %zu out of bounds\n"),
96 idx, section_name (ebl, idx), cnt - 2 - nbucket);
97 + buf += bighash ? 8 : sizeof(Elf32_Word);
102 @@ -2744,9 +2773,30 @@
103 cnt, section_name (ebl, cnt),
104 (int) shdr->sh_type);
106 -#define ALL_SH_FLAGS (SHF_WRITE | SHF_ALLOC | SHF_EXECINSTR | SHF_MERGE \
107 +#define GALL_SH_FLAGS (SHF_WRITE | SHF_ALLOC | SHF_EXECINSTR | SHF_MERGE \
108 | SHF_STRINGS | SHF_INFO_LINK | SHF_LINK_ORDER \
109 | SHF_OS_NONCONFORMING | SHF_GROUP | SHF_TLS)
110 + uint64_t ALL_SH_FLAGS = GALL_SH_FLAGS; /* generic */
111 + switch (ehdr->e_machine) {
113 + ALL_SH_FLAGS |= SHF_MIPS_GPREL | SHF_MIPS_MERGE | SHF_MIPS_ADDR |
114 + SHF_MIPS_STRINGS | SHF_MIPS_NOSTRIP | SHF_MIPS_LOCAL |
115 + SHF_MIPS_NAMES | SHF_MIPS_NODUPE;
118 + ALL_SH_FLAGS |= SHF_PARISC_SHORT | SHF_PARISC_HUGE | SHF_PARISC_SBP;
121 + ALL_SH_FLAGS |= SHF_ALPHA_GPREL;
124 + ALL_SH_FLAGS |= SHF_ARM_ENTRYSECT | SHF_ARM_COMDEF;
127 + ALL_SH_FLAGS |= SHF_IA_64_SHORT | SHF_IA_64_NORECOV;
131 if (shdr->sh_flags & ~ALL_SH_FLAGS)
132 ERROR (gettext ("section [%2zu] '%s' contains unknown flag(s)"
134 --- elfutils-0.116/libelf/elf32_getshdr.c.orig 2005-11-26 10:28:00.000000000 +0100
135 +++ elfutils-0.116/libelf/elf32_getshdr.c 2005-11-26 20:52:02.000000000 +0100
137 /* All the data is already mapped. If we could use it
138 directly this would already have happened. */
139 assert (ehdr->e_ident[EI_DATA] != MY_ELFDATA
140 - || (! ALLOW_UNALIGNED
142 + || ((! ALLOW_UNALIGNED)
143 + && ((uintptr_t) ((char *) elf->map_address + elf->start_offset + ehdr->e_shoff)
144 & (__alignof__ (ElfW2(LIBELFBITS,Shdr)) - 1)) != 0));
146 /* First see whether the information in the ELF header is
150 /* Now copy the data and at the same time convert the byte
152 + order, if needed. */
153 + if (ehdr->e_ident[EI_DATA] == MY_ELFDATA)
154 + memcpy (shdr, ((char*) elf->map_address + elf->start_offset + ehdr->e_shoff), size);
158 + || ((uintptr_t) ((char *) elf->map_address + elf->start_offset + ehdr->e_shoff)
159 & (__alignof__ (ElfW2(LIBELFBITS,Shdr)) - 1)) == 0)
160 notcvt = (ElfW2(LIBELFBITS,Shdr) *)
161 ((char *) elf->map_address
163 CONVERT_TO (shdr[cnt].sh_addralign, notcvt[cnt].sh_addralign);
164 CONVERT_TO (shdr[cnt].sh_entsize, notcvt[cnt].sh_entsize);
168 else if (likely (elf->fildes != -1))