mirror of
https://github.com/ipxe/ipxe
synced 2025-12-31 15:25:23 +03:00
[build] Formalise mechanism for accessing absolute symbols
In a position-dependent executable, where all addresses are fixed
at link time, we can use the standard technique as documented by
GNU ld to get the value of an absolute symbol, e.g.:
extern char _my_symbol[];
printf ( "Absolute symbol value is %x\n", ( ( int ) _my_symbol ) );
This technique may not work in a position-independent executable.
When dynamic relocations are applied, the runtime addresses will no
longer be equal to the link-time addresses. If the code to obtain the
address of _my_symbol uses PC-relative addressing, then it will
calculate the runtime "address" of the absolute symbol, which will no
longer be equal the the link-time "address" (i.e. the correct value)
of the absolute symbol.
Define macros ABS_SYMBOL(), ABS_VALUE_INIT(), and ABS_VALUE() that
provide access to the correct values of absolute symbols even in
position-independent code, and use these macros wherever absolute
symbols are accessed.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -55,12 +55,12 @@ extern void pxe_int_1a ( void );
|
||||
static int int_1a_hooked = 0;
|
||||
|
||||
/** Real-mode code segment size */
|
||||
extern char _text16_memsz[];
|
||||
#define _text16_memsz ( ( size_t ) _text16_memsz )
|
||||
extern size_t ABS_SYMBOL ( _text16_memsz );
|
||||
#define _text16_memsz ABS_VALUE ( _text16_memsz )
|
||||
|
||||
/** Real-mode data segment size */
|
||||
extern char _data16_memsz[];
|
||||
#define _data16_memsz ( ( size_t ) _data16_memsz )
|
||||
extern size_t ABS_SYMBOL (_data16_memsz );
|
||||
#define _data16_memsz ABS_VALUE ( _data16_memsz )
|
||||
|
||||
/** PXENV_UNDI_TRANSMIT API call profiler */
|
||||
static struct profiler pxe_api_tx_profiler __profiler =
|
||||
|
||||
Reference in New Issue
Block a user