1*7304104dSAndroid Build Coastguard Worker #undef ADD_ROUTINE_PREFIX
2*7304104dSAndroid Build Coastguard Worker #undef ADD_ROUTINE_SUFFIX
3*7304104dSAndroid Build Coastguard Worker
4*7304104dSAndroid Build Coastguard Worker #if ELF_WRLOCK_HELD
5*7304104dSAndroid Build Coastguard Worker #define CONCAT(x,y) x##y
6*7304104dSAndroid Build Coastguard Worker #define ADD_ROUTINE_PREFIX(y) CONCAT(__,y)
7*7304104dSAndroid Build Coastguard Worker #define ADD_ROUTINE_SUFFIX(x) x ## _wrlock
8*7304104dSAndroid Build Coastguard Worker #define INTERNAL internal_function
9*7304104dSAndroid Build Coastguard Worker #else
10*7304104dSAndroid Build Coastguard Worker #define ADD_ROUTINE_PREFIX(y) y
11*7304104dSAndroid Build Coastguard Worker #define ADD_ROUTINE_SUFFIX(x) x
12*7304104dSAndroid Build Coastguard Worker #define INTERNAL
13*7304104dSAndroid Build Coastguard Worker #endif
14*7304104dSAndroid Build Coastguard Worker
ElfW2(LIBELFBITS,Chdr)15*7304104dSAndroid Build Coastguard Worker ElfW2(LIBELFBITS,Chdr) *
16*7304104dSAndroid Build Coastguard Worker INTERNAL
17*7304104dSAndroid Build Coastguard Worker ADD_ROUTINE_PREFIX(elfw2(LIBELFBITS, ADD_ROUTINE_SUFFIX(getchdr))) (Elf_Scn *scn)
18*7304104dSAndroid Build Coastguard Worker {
19*7304104dSAndroid Build Coastguard Worker
20*7304104dSAndroid Build Coastguard Worker ElfW2(LIBELFBITS,Shdr) *shdr = ADD_ROUTINE_PREFIX(elfw2(LIBELFBITS, ADD_ROUTINE_SUFFIX(getshdr)))(scn);
21*7304104dSAndroid Build Coastguard Worker
22*7304104dSAndroid Build Coastguard Worker if (shdr == NULL)
23*7304104dSAndroid Build Coastguard Worker return NULL;
24*7304104dSAndroid Build Coastguard Worker
25*7304104dSAndroid Build Coastguard Worker /* Must have SHF_COMPRESSED flag set. Allocated or no bits sections
26*7304104dSAndroid Build Coastguard Worker can never be compressed. */
27*7304104dSAndroid Build Coastguard Worker if ((shdr->sh_flags & SHF_ALLOC) != 0)
28*7304104dSAndroid Build Coastguard Worker {
29*7304104dSAndroid Build Coastguard Worker __libelf_seterrno (ELF_E_INVALID_SECTION_FLAGS);
30*7304104dSAndroid Build Coastguard Worker return NULL;
31*7304104dSAndroid Build Coastguard Worker }
32*7304104dSAndroid Build Coastguard Worker
33*7304104dSAndroid Build Coastguard Worker if (shdr->sh_type == SHT_NULL
34*7304104dSAndroid Build Coastguard Worker || shdr->sh_type == SHT_NOBITS)
35*7304104dSAndroid Build Coastguard Worker {
36*7304104dSAndroid Build Coastguard Worker __libelf_seterrno (ELF_E_INVALID_SECTION_TYPE);
37*7304104dSAndroid Build Coastguard Worker return NULL;
38*7304104dSAndroid Build Coastguard Worker }
39*7304104dSAndroid Build Coastguard Worker
40*7304104dSAndroid Build Coastguard Worker if ((shdr->sh_flags & SHF_COMPRESSED) == 0)
41*7304104dSAndroid Build Coastguard Worker {
42*7304104dSAndroid Build Coastguard Worker __libelf_seterrno (ELF_E_NOT_COMPRESSED);
43*7304104dSAndroid Build Coastguard Worker return NULL;
44*7304104dSAndroid Build Coastguard Worker }
45*7304104dSAndroid Build Coastguard Worker
46*7304104dSAndroid Build Coastguard Worker /* This makes sure the data is in the correct format, so we don't
47*7304104dSAndroid Build Coastguard Worker need to swap fields. */
48*7304104dSAndroid Build Coastguard Worker Elf_Data *d = ADD_ROUTINE_PREFIX(ADD_ROUTINE_SUFFIX(elf_getdata)) (scn, NULL);
49*7304104dSAndroid Build Coastguard Worker if (d == NULL)
50*7304104dSAndroid Build Coastguard Worker return NULL;
51*7304104dSAndroid Build Coastguard Worker
52*7304104dSAndroid Build Coastguard Worker if (d->d_size < sizeof (ElfW2(LIBELFBITS,Chdr)) || d->d_buf == NULL)
53*7304104dSAndroid Build Coastguard Worker {
54*7304104dSAndroid Build Coastguard Worker __libelf_seterrno (ELF_E_INVALID_DATA);
55*7304104dSAndroid Build Coastguard Worker return NULL;
56*7304104dSAndroid Build Coastguard Worker }
57*7304104dSAndroid Build Coastguard Worker
58*7304104dSAndroid Build Coastguard Worker return (ElfW2(LIBELFBITS,Chdr) *) d->d_buf;
59*7304104dSAndroid Build Coastguard Worker }
60*7304104dSAndroid Build Coastguard Worker #undef INTERNAL
61*7304104dSAndroid Build Coastguard Worker #undef ELF_WRLOCK_HELD