summaryrefslogtreecommitdiffstats
path: root/lib/libelf
diff options
context:
space:
mode:
authorkaiw <kaiw@FreeBSD.org>2010-07-21 10:39:29 +0000
committerkaiw <kaiw@FreeBSD.org>2010-07-21 10:39:29 +0000
commitd137ff16e759f7c0a6acea318e5bd3c932082d79 (patch)
tree9e3351c461c35ef9a25f30454c83f6e09b0a3ccc /lib/libelf
parent49a7d97ce43a82f9cfa863a35ca5cc928d7caf1e (diff)
downloadFreeBSD-src-d137ff16e759f7c0a6acea318e5bd3c932082d79.zip
FreeBSD-src-d137ff16e759f7c0a6acea318e5bd3c932082d79.tar.gz
- Document that the *fsize() functions return a size of 1 for Elf
types that don't have a fixed size. - The *fsize() functions should return a size of 1, for variable length types. - Redefine symbol ELF_T_LAST to match the current end of the list. Obtained from: elftoolchain MFC after: 1 month
Diffstat (limited to 'lib/libelf')
-rw-r--r--lib/libelf/gelf_fsize.39
-rw-r--r--lib/libelf/libelf.h2
-rw-r--r--lib/libelf/libelf_data.c4
-rw-r--r--lib/libelf/libelf_fsize.m47
4 files changed, 10 insertions, 12 deletions
diff --git a/lib/libelf/gelf_fsize.3 b/lib/libelf/gelf_fsize.3
index 59fc5c2..2f7036b 100644
--- a/lib/libelf/gelf_fsize.3
+++ b/lib/libelf/gelf_fsize.3
@@ -47,9 +47,8 @@ These functions return the size in bytes of the file representation of
.Ar count
numbers of objects of ELF type
.Ar type .
-Argument
-.Ar type
-must be one that has a fixed size file representation.
+For ELF types that are of variable length, these functions return a
+size of one byte.
.Pp
Functions
.Fn elf32_fsize
@@ -83,10 +82,6 @@ had an unknown ELF class.
Argument
.Ar type
contained an illegal value.
-.It Bq Er ELF_E_ARGUMENT
-Argument
-.Ar type
-denoted an ELF type with variable size.
.It Bq Er ELF_E_UNIMPL
Support for ELF type
.Ar type
diff --git a/lib/libelf/libelf.h b/lib/libelf/libelf.h
index 7a707c3..ac4c04e 100644
--- a/lib/libelf/libelf.h
+++ b/lib/libelf/libelf.h
@@ -80,7 +80,7 @@ typedef enum {
} Elf_Type;
#define ELF_T_FIRST ELF_T_ADDR
-#define ELF_T_LAST ELF_T_XWORD
+#define ELF_T_LAST ELF_T_GNUHASH
/* Commands */
typedef enum {
diff --git a/lib/libelf/libelf_data.c b/lib/libelf/libelf_data.c
index 7749300..8f88694 100644
--- a/lib/libelf/libelf_data.c
+++ b/lib/libelf/libelf_data.c
@@ -42,6 +42,10 @@ _libelf_xlate_shtype(uint32_t sht)
return (ELF_T_SYM);
case SHT_FINI_ARRAY:
return (ELF_T_ADDR);
+#if __FreeBSD_version >= 800062
+ case SHT_GNU_HASH:
+ return (ELF_T_GNUHASH);
+#endif
case SHT_GROUP:
return (ELF_T_WORD);
case SHT_HASH:
diff --git a/lib/libelf/libelf_fsize.m4 b/lib/libelf/libelf_fsize.m4
index 53b9770..1cea997 100644
--- a/lib/libelf/libelf_fsize.m4
+++ b/lib/libelf/libelf_fsize.m4
@@ -48,8 +48,8 @@ define(`BYTE_SIZE', 1)
define(`IDENT_SIZE', `EI_NIDENT')
/* Types that have variable length. */
-define(`GNUHASH_SIZE', 0)
-define(`NOTE_SIZE', 0)
+define(`GNUHASH_SIZE', 1)
+define(`NOTE_SIZE', 1)
/* Currently unimplemented types. */
define(`MOVEP_SIZE', 0)
@@ -145,8 +145,7 @@ _libelf_fsize(Elf_Type t, int ec, unsigned int v, size_t c)
sz = 0;
if (v != EV_CURRENT)
LIBELF_SET_ERROR(VERSION, 0);
- else if ((int) t < ELF_T_FIRST || t > ELF_T_LAST ||
- t == ELF_T_NOTE || t == ELF_T_GNUHASH)
+ else if ((int) t < ELF_T_FIRST || t > ELF_T_LAST)
LIBELF_SET_ERROR(ARGUMENT, 0);
else {
sz = ec == ELFCLASS64 ? fsize[t].fsz64 : fsize[t].fsz32;
OpenPOWER on IntegriCloud