From 7158d2b1a33bdb747c3310f5fe5884dec8e31a72 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 4 Jul 1995 17:44:38 +0000 Subject: [PATCH] * emultempl/elf32.em (gld${EMULATION_NAME}_find_exp_assignment): Handle etree_provide. PR 7164. --- ld/ChangeLog | 3 +++ ld/emultempl/elf32.em | 22 ++++++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 605d1891af0..3ee74c409a6 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,5 +1,8 @@ Tue Jul 4 12:55:48 1995 Ian Lance Taylor + * emultempl/elf32.em (gld${EMULATION_NAME}_find_exp_assignment): + Handle etree_provide. + * emultempl/elf32.em (global_needed): New static variable. (global_found): Likewise. (gld${EMULATION_NAME}_after_open): New static function. diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index 9cfb3ea9732..bc84a8fc935 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -399,13 +399,31 @@ static void gld${EMULATION_NAME}_find_exp_assignment (exp) etree_type *exp; { + struct bfd_link_hash_entry *h; + switch (exp->type.node_class) { + case etree_provide: + h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst, + false, false, false); + if (h == NULL) + break; + + /* We call record_link_assignment even if the symbol is defined. + This is because if it is defined by a dynamic object, we + actually want to use the value defined by the linker script, + not the value from the dynamic object (because we are setting + symbols like etext). If the symbol is defined by a regular + object, then, as it happens, calling record_link_assignment + will do no harm. */ + + /* Fall through. */ case etree_assign: if (strcmp (exp->assign.dst, ".") != 0) { - if (! bfd_elf32_record_link_assignment (output_bfd, &link_info, - exp->assign.dst)) + if (! (bfd_elf32_record_link_assignment + (output_bfd, &link_info, exp->assign.dst, + exp->type.node_class == etree_provide ? true : false))) einfo ("%P%F: failed to record assignment to %s: %E\n", exp->assign.dst); } -- 2.30.2