To improve GCC 10 compatibility, it is necessary to remove the l_audit
zero-length array from the end of struct link_map. In preparation of
that, this commit introduces an accessor function for the audit state,
so that it is possible to change the representation of the audit state
without adjusting the code that accesses it.
Tested on x86_64-linux-gnu. Built on i686-gnu.
Change-Id: Id815673c29950fc011ae5301d7cde12624f658df
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->preinit != NULL)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->preinit != NULL)
- afct->preinit (&head->l_audit[cnt].cookie);
+ afct->preinit (&link_map_audit_state (head, cnt)->cookie);
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->objclose != NULL)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->objclose != NULL)
- /* Return value is ignored. */
- (void) afct->objclose (&imap->l_audit[cnt].cookie);
+ {
+ struct auditstate *state
+ = link_map_audit_state (imap, cnt);
+ /* Return value is ignored. */
+ (void) afct->objclose (&state->cookie);
+ }
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->activity != NULL)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->activity != NULL)
- afct->activity (&head->l_audit[cnt].cookie, LA_ACT_DELETE);
+ {
+ struct auditstate *state = link_map_audit_state (head, cnt);
+ afct->activity (&state->cookie, LA_ACT_DELETE);
+ }
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->activity != NULL)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->activity != NULL)
- afct->activity (&head->l_audit[cnt].cookie, LA_ACT_CONSISTENT);
+ {
+ struct auditstate *state = link_map_audit_state (head, cnt);
+ afct->activity (&state->cookie, LA_ACT_CONSISTENT);
+ }
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->objclose != NULL)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->objclose != NULL)
- /* Return value is ignored. */
- (void) afct->objclose (&l->l_audit[cnt].cookie);
-
+ {
+ struct auditstate *state
+ = link_map_audit_state (l, cnt);
+ /* Return value is ignored. */
+ (void) afct->objclose (&state->cookie);
+ }
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->activity != NULL)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->activity != NULL)
- afct->activity (&head->l_audit[cnt].cookie, LA_ACT_ADD);
+ afct->activity (&link_map_audit_state (head, cnt)->cookie,
+ LA_ACT_ADD);
{
if (afct->objopen != NULL)
{
{
if (afct->objopen != NULL)
{
- l->l_audit[cnt].bindflags
- = afct->objopen (l, nsid, &l->l_audit[cnt].cookie);
-
- l->l_audit_any_plt |= l->l_audit[cnt].bindflags != 0;
+ struct auditstate *state = link_map_audit_state (l, cnt);
+ state->bindflags = afct->objopen (l, nsid, &state->cookie);
+ l->l_audit_any_plt |= state->bindflags != 0;
{
if (afct->objsearch != NULL)
{
{
if (afct->objsearch != NULL)
{
- name = afct->objsearch (name, &loader->l_audit[cnt].cookie,
- whatcode);
+ struct auditstate *state = link_map_audit_state (loader, cnt);
+ name = afct->objsearch (name, &state->cookie, whatcode);
if (name == NULL)
/* Ignore the path. */
return -1;
if (name == NULL)
/* Ignore the path. */
return -1;
if (afct->objsearch != NULL)
{
const char *before = name;
if (afct->objsearch != NULL)
{
const char *before = name;
- name = afct->objsearch (name, &loader->l_audit[cnt].cookie,
- LA_SER_ORIG);
+ struct auditstate *state = link_map_audit_state (loader, cnt);
+ name = afct->objsearch (name, &state->cookie, LA_SER_ORIG);
if (name == NULL)
{
/* Do not try anything further. */
if (name == NULL)
{
/* Do not try anything further. */
struct link_map *new;
struct libname_list *newname;
#ifdef SHARED
struct link_map *new;
struct libname_list *newname;
#ifdef SHARED
- size_t audit_space = naudit * sizeof (new->l_audit[0]);
+ size_t audit_space = naudit * sizeof (struct auditstate);
#else
# define audit_space 0
#endif
#else
# define audit_space 0
#endif
#ifdef SHARED
for (unsigned int cnt = 0; cnt < naudit; ++cnt)
#ifdef SHARED
for (unsigned int cnt = 0; cnt < naudit; ++cnt)
- {
- new->l_audit[cnt].cookie = (uintptr_t) new;
- /* new->l_audit[cnt].bindflags = 0; */
- }
+ /* No need to initialize bindflags due to calloc. */
+ link_map_audit_state (new, cnt)->cookie = (uintptr_t) new;
#endif
/* new->l_global = 0; We use calloc therefore not necessary. */
#endif
/* new->l_global = 0; We use calloc therefore not necessary. */
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->activity != NULL)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->activity != NULL)
- afct->activity (&head->l_audit[cnt].cookie, LA_ACT_CONSISTENT);
+ {
+ struct auditstate *state = link_map_audit_state (head, cnt);
+ afct->activity (&state->cookie, LA_ACT_CONSISTENT);
+ }
{
/* XXX Check whether both DSOs must request action or
only one */
{
/* XXX Check whether both DSOs must request action or
only one */
- if ((l->l_audit[cnt].bindflags & LA_FLG_BINDFROM) != 0
- && (result->l_audit[cnt].bindflags & LA_FLG_BINDTO) != 0)
+ struct auditstate *l_state = link_map_audit_state (l, cnt);
+ struct auditstate *result_state
+ = link_map_audit_state (result, cnt);
+ if ((l_state->bindflags & LA_FLG_BINDFROM) != 0
+ && (result_state->bindflags & LA_FLG_BINDTO) != 0)
{
if (afct->symbind != NULL)
{
uintptr_t new_value
= afct->symbind (&sym, reloc_result->boundndx,
{
if (afct->symbind != NULL)
{
uintptr_t new_value
= afct->symbind (&sym, reloc_result->boundndx,
- &l->l_audit[cnt].cookie,
- &result->l_audit[cnt].cookie,
+ &l_state->cookie,
+ &result_state->cookie,
&flags,
strtab2 + defsym->st_name);
if (new_value != (uintptr_t) sym.st_value)
&flags,
strtab2 + defsym->st_name);
if (new_value != (uintptr_t) sym.st_value)
& (LA_SYMB_NOPLTENTER << (2 * (cnt + 1)))) == 0)
{
long int new_framesize = -1;
& (LA_SYMB_NOPLTENTER << (2 * (cnt + 1)))) == 0)
{
long int new_framesize = -1;
+ struct auditstate *l_state = link_map_audit_state (l, cnt);
+ struct auditstate *bound_state
+ = link_map_audit_state (reloc_result->bound, cnt);
uintptr_t new_value
= afct->ARCH_LA_PLTENTER (&sym, reloc_result->boundndx,
uintptr_t new_value
= afct->ARCH_LA_PLTENTER (&sym, reloc_result->boundndx,
- &l->l_audit[cnt].cookie,
- &reloc_result->bound->l_audit[cnt].cookie,
+ &l_state->cookie,
+ &bound_state->cookie,
regs, &flags, symname,
&new_framesize);
if (new_value != (uintptr_t) sym.st_value)
regs, &flags, symname,
&new_framesize);
if (new_value != (uintptr_t) sym.st_value)
&& (reloc_result->enterexit
& (LA_SYMB_NOPLTEXIT >> (2 * cnt))) == 0)
{
&& (reloc_result->enterexit
& (LA_SYMB_NOPLTEXIT >> (2 * cnt))) == 0)
{
+ struct auditstate *l_state = link_map_audit_state (l, cnt);
+ struct auditstate *bound_state
+ = link_map_audit_state (reloc_result->bound, cnt);
afct->ARCH_LA_PLTEXIT (&sym, reloc_result->boundndx,
afct->ARCH_LA_PLTEXIT (&sym, reloc_result->boundndx,
- &l->l_audit[cnt].cookie,
- &reloc_result->bound->l_audit[cnt].cookie,
+ &l_state->cookie, &bound_state->cookie,
inregs, outregs, symname);
}
inregs, outregs, symname);
}
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
+ struct auditstate *match_audit
+ = link_map_audit_state (match, cnt);
+ struct auditstate *result_audit
+ = link_map_audit_state (result, cnt);
if (afct->symbind != NULL
if (afct->symbind != NULL
- && ((match->l_audit[cnt].bindflags & LA_FLG_BINDFROM)
- != 0
- || ((result->l_audit[cnt].bindflags & LA_FLG_BINDTO)
+ && ((match_audit->bindflags & LA_FLG_BINDFROM) != 0
+ || ((result_audit->bindflags & LA_FLG_BINDTO)
!= 0)))
{
unsigned int flags = altvalue | LA_SYMB_DLSYM;
uintptr_t new_value
= afct->symbind (&sym, ndx,
!= 0)))
{
unsigned int flags = altvalue | LA_SYMB_DLSYM;
uintptr_t new_value
= afct->symbind (&sym, ndx,
- &match->l_audit[cnt].cookie,
- &result->l_audit[cnt].cookie,
+ &match_audit->cookie,
+ &result_audit->cookie,
&flags, strtab + ref->st_name);
if (new_value != (uintptr_t) sym.st_value)
{
&flags, strtab + ref->st_name);
if (new_value != (uintptr_t) sym.st_value)
{
else
*last_audit = (*last_audit)->next = &newp->ifaces;
else
*last_audit = (*last_audit)->next = &newp->ifaces;
- /* The dynamic linker link map is statically allocated, initialize
- the data now. */
- GL (dl_rtld_map).l_audit[GLRO (dl_naudit)].cookie
+ /* The dynamic linker link map is statically allocated, so the
+ cookie in _dl_new_object has not happened. */
+ link_map_audit_state (&GL (dl_rtld_map), GLRO (dl_naudit))->cookie
= (intptr_t) &GL (dl_rtld_map);
++GLRO(dl_naudit);
= (intptr_t) &GL (dl_rtld_map);
++GLRO(dl_naudit);
{
if (afct->objopen != NULL)
{
{
if (afct->objopen != NULL)
{
- map->l_audit[cnt].bindflags
- = afct->objopen (map, LM_ID_BASE, &map->l_audit[cnt].cookie);
- map->l_audit_any_plt |= map->l_audit[cnt].bindflags != 0;
+ struct auditstate *state = link_map_audit_state (map, cnt);
+ state->bindflags = afct->objopen (map, LM_ID_BASE, &state->cookie);
+ map->l_audit_any_plt |= state->bindflags != 0;
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->activity != NULL)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->activity != NULL)
- afct->activity (&main_map->l_audit[cnt].cookie, LA_ACT_ADD);
+ afct->activity (&link_map_audit_state (main_map, cnt)->cookie,
+ LA_ACT_ADD);
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->activity != NULL)
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
{
if (afct->activity != NULL)
- afct->activity (&head->l_audit[cnt].cookie, LA_ACT_CONSISTENT);
+ afct->activity (&link_map_audit_state (head, cnt)->cookie,
+ LA_ACT_CONSISTENT);
initialized and active ld.so copy. */
return GLRO(dl_init_all_dirs) != NULL;
}
initialized and active ld.so copy. */
return GLRO(dl_init_all_dirs) != NULL;
}
+
+static inline struct auditstate *
+link_map_audit_state (struct link_map *l, size_t index)
+{
+ return &l->l_audit[index];
+}
+#endif /* SHARED */