Use <osreldate.h> rather than the OS version reported by the kernel

to determine which Elf Types are to be handled.  Change the M4
templates to wrap an `#if __FreeBSD_version >= NNN'/`#endif' pair
around the generated code for each ELF data type, where `NNN' is
the OS version where the ELF type was added to the source tree.

This change allows cross-builds of old sources on newer FreeBSD
systems to work correctly.

Problem reported by:	ru
This commit is contained in:
Joseph Koshy 2006-12-18 05:40:01 +00:00
parent c2f3db731e
commit 2dacb27e06
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=165317
9 changed files with 74 additions and 67 deletions

View File

@ -24,16 +24,19 @@ SRCS= elf_begin.c \
elf_strptr.c \
elf_update.c \
elf_version.c \
gelf_cap.c \
gelf_checksum.c \
gelf_fsize.c \
gelf_getclass.c \
gelf_dyn.c \
gelf_ehdr.c \
gelf_getclass.c \
gelf_fsize.c \
gelf_move.c \
gelf_phdr.c \
gelf_rel.c \
gelf_rela.c \
gelf_shdr.c \
gelf_sym.c \
gelf_syminfo.c \
gelf_symshndx.c \
gelf_xlate.c \
libelf.c \
@ -53,16 +56,8 @@ GENSRCS= libelf_fsize.c libelf_msize.c libelf_convert.c
CLEANFILES= ${GENSRCS}
CFLAGS+= -I. -I${.CURDIR}
OSRELDATE!= sysctl -n kern.osreldate
SHLIB_MAJOR= 1
.if ${OSRELDATE} > 700009
SRCS+= gelf_cap.c \
gelf_move.c \
gelf_syminfo.c
.endif
WARNS?= 6
MAN= elf.3 \
@ -162,4 +157,4 @@ libelf_msize.c: elf_types.m4 libelf_msize.m4
# Keep the .SUFFIXES line after the include of bsd.lib.mk
.SUFFIXES: .m4 .c
.m4.c:
m4 -D SRCDIR=${.CURDIR} -D OSRELDATE=${OSRELDATE} ${.IMPSRC} > ${.TARGET}
m4 -D SRCDIR=${.CURDIR} ${.IMPSRC} > ${.TARGET}

View File

@ -28,33 +28,43 @@
/*
* ELF types, defined in the "enum Elf_Type" API.
*
* The members of the list form a 3-tuple: (name, C-type-suffix, OSversion).
* + `name' is an Elf_Type symbol without the `ELF_T_' prefix.
* + `C-type-suffix' is the suffix for Elf32_ and Elf64_ type names.
* + `version' is the OS version the symbol first appeared in.
*
* OS revisions of note are:
* 600102 - The earliest (6.0-STABLE) version supported by this code.
* 700009 - Symbol versioning and ELF64 type changes.
* 700025 - More ELF types and the introduction of libelf.
*/
define(`ELF_TYPE_LIST',
``ADDR, Addr',
`BYTE, Byte',
`CAP, Cap',
`DYN, Dyn',
`EHDR, Ehdr',
`HALF, Half',
`LWORD, Lword',
`MOVE, Move',
`MOVEP, MoveP',
`NOTE, Note',
`OFF, Off',
`PHDR, Phdr',
`REL, Rel',
`RELA, Rela',
`SHDR, Shdr',
`SWORD, Sword',
`SXWORD, Sxword',
`SYMINFO, Syminfo',
`SYM, Sym',
`VDEF, Verdef',
`VNEED, Verneed',
`WORD, Word',
`XWORD, Xword',
`NUM, _'')
``ADDR, Addr, 600102',
`BYTE, Byte, 600102',
`CAP, Cap, 700025',
`DYN, Dyn, 600102',
`EHDR, Ehdr, 600102',
`HALF, Half, 600102',
`LWORD, Lword, 700025',
`MOVE, Move, 700025',
`MOVEP, MoveP, 700025',
`NOTE, Note, 600102',
`OFF, Off, 600102',
`PHDR, Phdr, 600102',
`REL, Rel, 600102',
`RELA, Rela, 600102',
`SHDR, Shdr, 600102',
`SWORD, Sword, 600102',
`SXWORD, Sxword, 700009',
`SYMINFO, Syminfo, 700025',
`SYM, Sym, 600102',
`VDEF, Verdef, 700009',
`VNEED, Verneed, 700009',
`WORD, Word, 600102',
`XWORD, Xword, 700009',
`NUM, _, _'')
/*
* DEFINE_STRUCT(NAME,MEMBERLIST...)

View File

@ -50,7 +50,7 @@ typedef Elf64_Sym GElf_Sym; /* Symbol table entries */
typedef Elf64_Rel GElf_Rel; /* Relocation entries */
typedef Elf64_Rela GElf_Rela; /* Relocation entries with addend */
#if __FreeBSD_version > 700009
#if __FreeBSD_version >= 700025
typedef Elf64_Cap GElf_Cap; /* SW/HW capabilities */
typedef Elf64_Move GElf_Move; /* Move entries */
typedef Elf64_Syminfo GElf_Syminfo; /* Symbol information */
@ -84,7 +84,7 @@ int gelf_update_symshndx(Elf_Data *_symdst, Elf_Data *_shindexdst,
Elf_Data *gelf_xlatetof(Elf *_elf, Elf_Data *_dst, const Elf_Data *_src, unsigned int _encode);
Elf_Data *gelf_xlatetom(Elf *_elf, Elf_Data *_dst, const Elf_Data *_src, unsigned int _encode);
#if __FreeBSD_version > 700009
#if __FreeBSD_version >= 700025
GElf_Cap *gelf_getcap(Elf_Data *_data, int _index, GElf_Cap *_cap);
GElf_Move *gelf_getmove(Elf_Data *_src, int _index, GElf_Move *_dst);
GElf_Syminfo *gelf_getsyminfo(Elf_Data *_src, int _index, GElf_Syminfo *_dst);

View File

@ -31,9 +31,12 @@ __FBSDID("$FreeBSD$");
#include <assert.h>
#include <gelf.h>
#include <osreldate.h>
#include "_libelf.h"
#if __FreeBSD_version >= 700025
GElf_Cap *
gelf_getcap(Elf_Data *d, int ndx, GElf_Cap *dst)
{
@ -143,3 +146,5 @@ gelf_update_cap(Elf_Data *d, int ndx, GElf_Cap *gc)
return (1);
}
#endif /* __FreeBSD_version >= 700025 */

View File

@ -31,9 +31,12 @@ __FBSDID("$FreeBSD$");
#include <assert.h>
#include <gelf.h>
#include <osreldate.h>
#include "_libelf.h"
#if __FreeBSD_version >= 700025
GElf_Move *
gelf_getmove(Elf_Data *d, int ndx, GElf_Move *dst)
{
@ -149,3 +152,5 @@ gelf_update_move(Elf_Data *d, int ndx, GElf_Move *gm)
return (1);
}
#endif /* __FreeBSD_version >= 700025 */

View File

@ -31,9 +31,12 @@ __FBSDID("$FreeBSD$");
#include <assert.h>
#include <gelf.h>
#include <osreldate.h>
#include "_libelf.h"
#if __FreeBSD_version >= 700025
GElf_Syminfo *
gelf_getsyminfo(Elf_Data *d, int ndx, GElf_Syminfo *dst)
{
@ -144,3 +147,5 @@ gelf_update_syminfo(Elf_Data *d, int ndx, GElf_Syminfo *gs)
return (1);
}
#endif /* __FreeBSD_version >= 700025 */

View File

@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$");
#include <assert.h>
#include <libelf.h>
#include <osreldate.h>
#include <string.h>
#include "_libelf.h"
@ -234,15 +235,6 @@ define(`IGNORE',
IGNORE(MOVEP)
IGNORE(NOTE)
ifelse(eval(OSRELDATE < 700009),1,
`IGNORE(CAP)
IGNORE(MOVE)
IGNORE(SYMINFO)
IGNORE(VDEF)
IGNORE(VNEED)
define(`IGNORE_LWORD', 1)',
`')
define(IGNORE_BYTE, 1) /* 'lator, leave 'em bytes alone */
define(IGNORE_NOTE, 1)
define(IGNORE_SXWORD32, 1)
@ -455,7 +447,8 @@ libelf_cvt$3_$1_tom(char *dst, char *src, size_t count, int byteswap)
*/
define(`MAKE_TYPE_CONVERTER',
`ifdef(`BASE'_$1,
`#if __FreeBSD_version >= $3 /* $1 */
ifdef(`BASE'_$1,
`ifdef(`IGNORE_'$1,`',
`MAKEPRIM_TO_F($1,$2,`',64)
MAKEPRIM_TO_M($1,$2,`',64)')',
@ -467,7 +460,9 @@ define(`MAKE_TYPE_CONVERTER',
`MAKE_TO_F($1,$2,32)dnl
MAKE_TO_F($1,$2,64)dnl
MAKE_TO_M($1,$2,32)dnl
MAKE_TO_M($1,$2,64)')')')
MAKE_TO_M($1,$2,64)')')
#endif /* $1 */
')
define(`MAKE_TYPE_CONVERTERS',
`ifelse($#,1,`',
@ -618,9 +613,11 @@ define(`CONV',
`.$3$2 = libelf_cvt$2_$1_$3')')')')
define(`CONVERTER_NAME',
`[ELF_T_$1] = {
`#if __FreeBSD_version >= $3
[ELF_T_$1] = {
CONV($1,32,tof), CONV($1,32,tom),
CONV($1,64,tof), CONV($1,64,tom) },
#endif
')')
define(`CONVERTER_NAMES',

View File

@ -27,6 +27,7 @@
*/
#include <libelf.h>
#include <osreldate.h>
#include "_libelf.h"
@ -54,14 +55,6 @@ define(`MOVEP_SIZE', 0)
define(`XWORD_SIZE32', 0)
define(`SXWORD_SIZE32', 0)
ifelse(eval(OSRELDATE < 700009),1,
`define(`CAP_SIZE', 0)
define(`LWORD_SIZE', 0)
define(`MOVE_SIZE', 0)
define(`SYMINFO_SIZE', 0)
define(`VDEF_SIZE', 0)
define(`VNEED_SIZE', 0)',`')
/*
* FSZ{32,64} define the sizes of 32 and 64 bit file structures respectively.
*/
@ -122,7 +115,9 @@ DEFINE_ELF_FSIZES(ELF_TYPE_LIST)
DEFINE_ELF_FSIZE(`IDENT',`') # `IDENT' is a pseudo type
define(`FSIZE',
`[ELF_T_$1] = { .fsz32 = $1_SIZE32, .fsz64 = $1_SIZE64 },')
`#if __FreeBSD_version >= $3
[ELF_T_$1] = { .fsz32 = $1_SIZE32, .fsz64 = $1_SIZE64 },
#endif')
define(`FSIZES',
`ifelse($#,1,`',
`FSIZE($1)

View File

@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$");
#include <assert.h>
#include <libelf.h>
#include <osreldate.h>
#include <string.h>
#include "_libelf.h"
@ -57,14 +58,6 @@ define(MOVEP_SIZE, 0)
define(SXWORD_SIZE32, 0)
define(XWORD_SIZE32, 0)
ifelse(eval(OSRELDATE < 700009),1,
`define(`CAP_SIZE', 0)
define(`LWORD_SIZE', 0)
define(`MOVE_SIZE', 0)
define(`SYMINFO_SIZE', 0)
define(`VDEF_SIZE', 0)
define(`VNEED_SIZE', 0)',`')
define(`DEFINE_ELF_MSIZE',
`ifdef($1`_SIZE',
`define($1_SIZE32,$1_SIZE)
@ -81,7 +74,9 @@ define(`DEFINE_ELF_MSIZES',
DEFINE_ELF_MSIZES(ELF_TYPE_LIST)
define(`MSIZE',
`[ELF_T_$1] = { .msz32 = $1_SIZE32, .msz64 = $1_SIZE64 },')
`#if __FreeBSD_version >= $3
[ELF_T_$1] = { .msz32 = $1_SIZE32, .msz64 = $1_SIZE64 },
#endif')
define(`MSIZES',
`ifelse($#,1,`',
`MSIZE($1)