diff options
author | Kai Wang <kaiw@FreeBSD.org> | 2010-07-21 10:39:29 +0000 |
---|---|---|
committer | Kai Wang <kaiw@FreeBSD.org> | 2010-07-21 10:39:29 +0000 |
commit | fff07a4233ac0166070431a563ed3b644a091885 (patch) | |
tree | 9e3351c461c35ef9a25f30454c83f6e09b0a3ccc | |
parent | f0f10541db7240f5b549bd2590c1eec9f3d17e4e (diff) | |
download | src-fff07a4233ac0166070431a563ed3b644a091885.tar.gz src-fff07a4233ac0166070431a563ed3b644a091885.zip |
- 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
Notes
Notes:
svn path=/head/; revision=210340
-rw-r--r-- | lib/libelf/gelf_fsize.3 | 9 | ||||
-rw-r--r-- | lib/libelf/libelf.h | 2 | ||||
-rw-r--r-- | lib/libelf/libelf_data.c | 4 | ||||
-rw-r--r-- | lib/libelf/libelf_fsize.m4 | 7 |
4 files changed, 10 insertions, 12 deletions
diff --git a/lib/libelf/gelf_fsize.3 b/lib/libelf/gelf_fsize.3 index 59fc5c2cf381..2f7036bb3263 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 7a707c30e547..ac4c04e26c70 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 77493005bc1f..8f88694573e0 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 53b97702bdc8..1cea99713a04 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; |