Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Extended ELF ABI version handling only for Linux.
If the OSABI is generic we should not allow the ABI version to be nonzero.
Move all the new functionality into Linux-specific files.
  • Loading branch information
Ulrich Drepper committed Mar 17, 2010
1 parent 8ed9a2b commit d8c4789
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 7 deletions.
10 changes: 10 additions & 0 deletions ChangeLog
@@ -1,5 +1,15 @@
2010-03-16 Ulrich Drepper <drepper@redhat.com>

* elf/dl-load.c (VALID_ELF_ABIVERSION): Add additional osabi parameter.
Not used here.
(open_verify): Modify for extended VALID_ELF_ABIVERSION macro
interface.
* sysdeps/unix/sysv/linux/ldsodefs.h (VALID_ELF_ABIVERSION): Add
additional osabi parameter. Only acceept nonzero ABI versions if osabi
is Linux.
Fix includes.
(expected2): Don't explicitly initialize EI_ABIVERSION byte.

* sysdeps/unix/sysv/linux/ldsodefs.h (VALID_ELF_ABIVERSION): Update
definition to follow generic code.

Expand Down
8 changes: 5 additions & 3 deletions elf/dl-load.c
Expand Up @@ -1569,7 +1569,7 @@ open_verify (const char *name, struct filebuf *fbp, struct link_map *loader,
#ifndef VALID_ELF_HEADER
# define VALID_ELF_HEADER(hdr,exp,size) (memcmp (hdr, exp, size) == 0)
# define VALID_ELF_OSABI(osabi) (osabi == ELFOSABI_SYSV)
# define VALID_ELF_ABIVERSION(ver) (ver < LIBC_ABI_MAX)
# define VALID_ELF_ABIVERSION(osabi,ver) (ver == 0)
#elif defined MORE_ELF_HEADER_DATA
MORE_ELF_HEADER_DATA;
#endif
Expand Down Expand Up @@ -1656,7 +1656,8 @@ open_verify (const char *name, struct filebuf *fbp, struct link_map *loader,
/* See whether the ELF header is what we expect. */
if (__builtin_expect (! VALID_ELF_HEADER (ehdr->e_ident, expected,
EI_ABIVERSION)
|| !VALID_ELF_ABIVERSION (ehdr->e_ident[EI_ABIVERSION]),
|| !VALID_ELF_ABIVERSION (ehdr->e_ident[EI_OSABI],
ehdr->e_ident[EI_ABIVERSION]),
0))
{
/* Something is wrong. */
Expand Down Expand Up @@ -1697,7 +1698,8 @@ open_verify (const char *name, struct filebuf *fbp, struct link_map *loader,
allowed here. */
else if (!VALID_ELF_OSABI (ehdr->e_ident[EI_OSABI]))
errstring = N_("ELF file OS ABI invalid");
else if (!VALID_ELF_ABIVERSION (ehdr->e_ident[EI_ABIVERSION]))
else if (!VALID_ELF_ABIVERSION (ehdr->e_ident[EI_OSABI],
ehdr->e_ident[EI_ABIVERSION]))
errstring = N_("ELF file ABI version invalid");
else
/* Otherwise we don't know what went wrong. */
Expand Down
9 changes: 5 additions & 4 deletions sysdeps/unix/sysv/linux/ldsodefs.h
@@ -1,5 +1,5 @@
/* Run-time dynamic linker data structures for loaded ELF shared objects.
Copyright (C) 2001, 2002, 2003, 2006, 2009 Free Software Foundation, Inc.
Copyright (C) 2001, 2002, 2003, 2006, 2009, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
Expand All @@ -19,6 +19,7 @@

#ifndef _LDSODEFS_H

#include <libc-abis.h>
#include <kernel-features.h>

/* Get the real definitions. */
Expand Down Expand Up @@ -58,7 +59,8 @@ extern void _dl_non_dynamic_init (void) internal_function;
|| memcmp (hdr, expected2, size) == 0)
#define VALID_ELF_OSABI(osabi) (osabi == ELFOSABI_SYSV \
|| osabi == ELFOSABI_LINUX)
#define VALID_ELF_ABIVERSION(ver) (ver < LIBC_ABI_MAX)
#define VALID_ELF_ABIVERSION(osabi,ver) \
(ver == 0 || (osabi == ELFOSABI_LINUX && ver < LIBC_ABI_MAX))
#define MORE_ELF_HEADER_DATA \
static const unsigned char expected2[EI_PAD] = \
{ \
Expand All @@ -69,8 +71,7 @@ extern void _dl_non_dynamic_init (void) internal_function;
[EI_CLASS] = ELFW(CLASS), \
[EI_DATA] = byteorder, \
[EI_VERSION] = EV_CURRENT, \
[EI_OSABI] = ELFOSABI_LINUX, \
[EI_ABIVERSION] = 0 \
[EI_OSABI] = ELFOSABI_LINUX \
}

#endif /* ldsodefs.h */

0 comments on commit d8c4789

Please sign in to comment.