xref: /aosp_15_r20/external/elfutils/libelf/elf32_getchdr.h (revision 7304104da70ce23c86437a01be71edd1a2d7f37e)
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