diff -uprN -x .svn -x ChangeLog.addr ../../binutils/src/ld/emultempl/elf32.em ld/emultempl/elf32.em --- ../../binutils/src/ld/emultempl/elf32.em 2008-11-03 11:38:40.000000000 -0800 +++ ld/emultempl/elf32.em 2009-01-12 18:23:03.000000000 -0800 @@ -145,6 +145,31 @@ gld${EMULATION_NAME}_load_symbols (lang_ EOF fi +if test x"$LDEMUL_GET_CONSTANT" != xgld"${EMULATION_NAME}"_get_constant; then +fragment <new_vers_pattern) (entry); return entry; } + +bfd_vma +ldemul_get_constant (enum ld_emul_constant constant) +{ + return (*ld_emulation->get_constant) (constant); +} + +bfd_vma +get_constant_default (enum ld_emul_constant ignore ATTRIBUTE_UNUSED) +{ + abort (); + return (bfd_vma) -1; +} + diff -uprN -x .svn -x ChangeLog.addr ../../binutils/src/ld/ldemul.h ld/ldemul.h --- ../../binutils/src/ld/ldemul.h 2008-11-03 11:38:40.000000000 -0800 +++ ld/ldemul.h 2009-01-12 18:25:26.000000000 -0800 @@ -97,6 +97,19 @@ extern int ldemul_find_potential_librar extern struct bfd_elf_version_expr *ldemul_new_vers_pattern (struct bfd_elf_version_expr *); +enum ld_emul_constant + { + /* The first byte of the text segment in executable. */ + text_start_addr, + /* The first byte of the text segment in shared library. */ + shlib_text_start_addr + }; + +extern bfd_vma get_constant_default + (enum ld_emul_constant); +extern bfd_vma ldemul_get_constant + (enum ld_emul_constant); + typedef struct ld_emulation_xfer_struct { /* Run before parsing the command line and script file. Set the architecture, maybe other things. */ @@ -196,6 +209,9 @@ typedef struct ld_emulation_xfer_struct struct bfd_elf_version_expr * (*new_vers_pattern) (struct bfd_elf_version_expr *); + /* Return the value of constant. */ + bfd_vma (*get_constant) (enum ld_emul_constant); + } ld_emulation_xfer_type; typedef enum { diff -uprN -x .svn -x ChangeLog.addr ../../binutils/src/ld/ldexp.c ld/ldexp.c --- ../../binutils/src/ld/ldexp.c 2008-09-30 12:56:03.000000000 -0700 +++ ld/ldexp.c 2009-01-12 18:16:54.000000000 -0800 @@ -40,6 +40,8 @@ #include "ldlex.h" #include #include "ldlang.h" +#include "ldfile.h" +#include "ldemul.h" #include "libiberty.h" #include "safe-ctype.h" @@ -677,8 +679,24 @@ fold_name (etree_type *tree) else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0) new_abs (bfd_emul_get_commonpagesize (default_target)); else - einfo (_("%F%S: unknown constant `%s' referenced in expression\n"), - tree->name.name); + { + enum ld_emul_constant constant; + + if (strcmp (tree->name.name, "TEXT_START_ADDR") == 0) + constant = text_start_addr; + else if (strcmp (tree->name.name, "SHLIB_TEXT_START_ADDR") + == 0) + constant = shlib_text_start_addr; + else + { + einfo (_("%F%S: unknown constant `%s' referenced in expression\n"), + tree->name.name); + /* Silence gcc 3.4. */ + constant = text_start_addr; + } + + new_abs (ldemul_get_constant (constant)); + } break; default: diff -uprN -x .svn -x ChangeLog.addr ../../binutils/src/ld/ld.h ld/ld.h --- ../../binutils/src/ld/ld.h 2008-06-03 09:01:28.000000000 -0700 +++ ld/ld.h 2009-01-12 12:05:21.000000000 -0800 @@ -300,6 +300,9 @@ typedef struct { /* The common page size for ELF. */ bfd_vma commonpagesize; + + /* The first byte of the text segment for ELF. */ + bfd_vma text_start_addr; } ld_config_type; extern ld_config_type config; diff -uprN -x .svn -x ChangeLog.addr ../../binutils/src/ld/ld.texinfo ld/ld.texinfo --- ../../binutils/src/ld/ld.texinfo 2009-01-09 12:38:00.000000000 -0800 +++ ld/ld.texinfo 2009-01-12 18:18:49.000000000 -0800 @@ -1049,6 +1049,12 @@ Set the emulation maximum page size to @ @item common-page-size=@var{value} Set the emulation common page size to @var{value}. +@item text-start-addr=@var{value} +Set the first byte of the text segment in executable to @var{value}. + +@item shlib-text-start-addr=@var{value} +Set the first byte of the text segment in shared library to @var{value}. + @end table Other keywords are ignored for Solaris compatibility. diff -uprN -x .svn -x ChangeLog.addr ../../binutils/src/ld/scripttempl/elf.sc ld/scripttempl/elf.sc --- ../../binutils/src/ld/scripttempl/elf.sc 2008-12-04 06:55:48.000000000 -0800 +++ ld/scripttempl/elf.sc 2009-01-12 18:20:51.000000000 -0800 @@ -244,9 +244,9 @@ STACK=" .stack ${RELOCATING-0}${ # if this is for an embedded system, don't add SIZEOF_HEADERS. if [ -z "$EMBEDDED" ]; then - test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR} + SIZEOF_HEADERS" + test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="CONSTANT (TEXT_START_ADDR) + SIZEOF_HEADERS" else - test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR}" + test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="CONSTANT (TEXT_START_ADDR)" fi cat <