1 /* This module handles expression trees. 2 Copyright (C) 1991-2022 Free Software Foundation, Inc. 3 Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>. 4 5 This file is part of the GNU Binutils. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 20 MA 02110-1301, USA. */ 21 22 23 /* This module is in charge of working out the contents of expressions. 24 25 It has to keep track of the relative/absness of a symbol etc. This 26 is done by keeping all values in a struct (an etree_value_type) 27 which contains a value, a section to which it is relative and a 28 valid bit. */ 29 30 #include "sysdep.h" 31 #include "bfd.h" 32 #include "bfdlink.h" 33 #include "ctf-api.h" 34 35 #include "ld.h" 36 #include "ldmain.h" 37 #include "ldmisc.h" 38 #include "ldexp.h" 39 #include "ldlex.h" 40 #include <ldgram.h> 41 #include "ldlang.h" 42 #include "libiberty.h" 43 #include "safe-ctype.h" 44 45 static void exp_fold_tree_1 (etree_type *); 46 static bfd_vma align_n (bfd_vma, bfd_vma); 47 48 segment_type *segments; 49 50 struct ldexp_control expld; 51 52 /* This structure records symbols for which we need to keep track of 53 definedness for use in the DEFINED () test. It is also used in 54 making absolute symbols section relative late in the link. */ 55 56 struct definedness_hash_entry 57 { 58 struct bfd_hash_entry root; 59 60 /* If this symbol was assigned from "dot" outside of an output 61 section statement, the section we'd like it relative to. */ 62 asection *final_sec; 63 64 /* Low bits of iteration count. Symbols with matching iteration have 65 been defined in this pass over the script. */ 66 unsigned int iteration : 8; 67 68 /* Symbol was defined by an object file. */ 69 unsigned int by_object : 1; 70 }; 71 72 static struct bfd_hash_table definedness_table; 73 74 /* Print the string representation of the given token. Surround it 75 with spaces if INFIX_P is TRUE. */ 76 77 static void 78 exp_print_token (token_code_type code, int infix_p) 79 { 80 static const struct 81 { 82 token_code_type code; 83 const char *name; 84 } 85 table[] = 86 { 87 { INT, "int" }, 88 { NAME, "NAME" }, 89 { PLUSEQ, "+=" }, 90 { MINUSEQ, "-=" }, 91 { MULTEQ, "*=" }, 92 { DIVEQ, "/=" }, 93 { LSHIFTEQ, "<<=" }, 94 { RSHIFTEQ, ">>=" }, 95 { ANDEQ, "&=" }, 96 { OREQ, "|=" }, 97 { OROR, "||" }, 98 { ANDAND, "&&" }, 99 { EQ, "==" }, 100 { NE, "!=" }, 101 { LE, "<=" }, 102 { GE, ">=" }, 103 { LSHIFT, "<<" }, 104 { RSHIFT, ">>" }, 105 { LOG2CEIL, "LOG2CEIL" }, 106 { ALIGN_K, "ALIGN" }, 107 { BLOCK, "BLOCK" }, 108 { QUAD, "QUAD" }, 109 { SQUAD, "SQUAD" }, 110 { LONG, "LONG" }, 111 { SHORT, "SHORT" }, 112 { BYTE, "BYTE" }, 113 { SECTIONS, "SECTIONS" }, 114 { SIZEOF_HEADERS, "SIZEOF_HEADERS" }, 115 { MEMORY, "MEMORY" }, 116 { DEFINED, "DEFINED" }, 117 { TARGET_K, "TARGET" }, 118 { SEARCH_DIR, "SEARCH_DIR" }, 119 { MAP, "MAP" }, 120 { ENTRY, "ENTRY" }, 121 { NEXT, "NEXT" }, 122 { ALIGNOF, "ALIGNOF" }, 123 { SIZEOF, "SIZEOF" }, 124 { ADDR, "ADDR" }, 125 { LOADADDR, "LOADADDR" }, 126 { CONSTANT, "CONSTANT" }, 127 { ABSOLUTE, "ABSOLUTE" }, 128 { MAX_K, "MAX" }, 129 { MIN_K, "MIN" }, 130 { ASSERT_K, "ASSERT" }, 131 { REL, "relocatable" }, 132 { DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" }, 133 { DATA_SEGMENT_RELRO_END, "DATA_SEGMENT_RELRO_END" }, 134 { DATA_SEGMENT_END, "DATA_SEGMENT_END" }, 135 { ORIGIN, "ORIGIN" }, 136 { LENGTH, "LENGTH" }, 137 { SEGMENT_START, "SEGMENT_START" } 138 }; 139 unsigned int idx; 140 141 for (idx = 0; idx < ARRAY_SIZE (table); idx++) 142 if (table[idx].code == code) 143 break; 144 145 if (infix_p) 146 fputc (' ', config.map_file); 147 148 if (idx < ARRAY_SIZE (table)) 149 fputs (table[idx].name, config.map_file); 150 else if (code < 127) 151 fputc (code, config.map_file); 152 else 153 fprintf (config.map_file, "<code %d>", code); 154 155 if (infix_p) 156 fputc (' ', config.map_file); 157 } 158 159 static void 160 make_log2ceil (void) 161 { 162 bfd_vma value = expld.result.value; 163 bfd_vma result = -1; 164 bool round_up = false; 165 166 do 167 { 168 result++; 169 /* If more than one bit is set in the value we will need to round up. */ 170 if ((value > 1) && (value & 1)) 171 round_up = true; 172 } 173 while (value >>= 1); 174 175 if (round_up) 176 result += 1; 177 expld.result.section = NULL; 178 expld.result.value = result; 179 } 180 181 static void 182 make_abs (void) 183 { 184 if (expld.result.section != NULL) 185 expld.result.value += expld.result.section->vma; 186 expld.result.section = bfd_abs_section_ptr; 187 expld.rel_from_abs = false; 188 } 189 190 static void 191 new_abs (bfd_vma value) 192 { 193 expld.result.valid_p = true; 194 expld.result.section = bfd_abs_section_ptr; 195 expld.result.value = value; 196 expld.result.str = NULL; 197 } 198 199 etree_type * 200 exp_intop (bfd_vma value) 201 { 202 etree_type *new_e = stat_alloc (sizeof (new_e->value)); 203 new_e->type.node_code = INT; 204 new_e->type.filename = ldlex_filename (); 205 new_e->type.lineno = lineno; 206 new_e->value.value = value; 207 new_e->value.str = NULL; 208 new_e->type.node_class = etree_value; 209 return new_e; 210 } 211 212 etree_type * 213 exp_bigintop (bfd_vma value, char *str) 214 { 215 etree_type *new_e = stat_alloc (sizeof (new_e->value)); 216 new_e->type.node_code = INT; 217 new_e->type.filename = ldlex_filename (); 218 new_e->type.lineno = lineno; 219 new_e->value.value = value; 220 new_e->value.str = str; 221 new_e->type.node_class = etree_value; 222 return new_e; 223 } 224 225 /* Build an expression representing an unnamed relocatable value. */ 226 227 etree_type * 228 exp_relop (asection *section, bfd_vma value) 229 { 230 etree_type *new_e = stat_alloc (sizeof (new_e->rel)); 231 new_e->type.node_code = REL; 232 new_e->type.filename = ldlex_filename (); 233 new_e->type.lineno = lineno; 234 new_e->type.node_class = etree_rel; 235 new_e->rel.section = section; 236 new_e->rel.value = value; 237 return new_e; 238 } 239 240 static void 241 new_number (bfd_vma value) 242 { 243 expld.result.valid_p = true; 244 expld.result.value = value; 245 expld.result.str = NULL; 246 expld.result.section = NULL; 247 } 248 249 static void 250 new_rel (bfd_vma value, asection *section) 251 { 252 expld.result.valid_p = true; 253 expld.result.value = value; 254 expld.result.str = NULL; 255 expld.result.section = section; 256 } 257 258 static void 259 new_rel_from_abs (bfd_vma value) 260 { 261 asection *s = expld.section; 262 263 expld.rel_from_abs = true; 264 expld.result.valid_p = true; 265 expld.result.value = value - s->vma; 266 expld.result.str = NULL; 267 expld.result.section = s; 268 } 269 270 /* New-function for the definedness hash table. */ 271 272 static struct bfd_hash_entry * 273 definedness_newfunc (struct bfd_hash_entry *entry, 274 struct bfd_hash_table *table ATTRIBUTE_UNUSED, 275 const char *name ATTRIBUTE_UNUSED) 276 { 277 struct definedness_hash_entry *ret = (struct definedness_hash_entry *) entry; 278 279 if (ret == NULL) 280 ret = (struct definedness_hash_entry *) 281 bfd_hash_allocate (table, sizeof (struct definedness_hash_entry)); 282 283 if (ret == NULL) 284 einfo (_("%F%P: bfd_hash_allocate failed creating symbol %s\n"), name); 285 286 ret->by_object = 0; 287 ret->iteration = 0; 288 return &ret->root; 289 } 290 291 /* Called during processing of linker script script expressions. 292 For symbols assigned in a linker script, return a struct describing 293 where the symbol is defined relative to the current expression, 294 otherwise return NULL. */ 295 296 static struct definedness_hash_entry * 297 symbol_defined (const char *name) 298 { 299 return ((struct definedness_hash_entry *) 300 bfd_hash_lookup (&definedness_table, name, false, false)); 301 } 302 303 /* Update the definedness state of NAME. Return FALSE if script symbol 304 is multiply defining a strong symbol in an object. */ 305 306 static bool 307 update_definedness (const char *name, struct bfd_link_hash_entry *h) 308 { 309 bool ret; 310 struct definedness_hash_entry *defentry 311 = (struct definedness_hash_entry *) 312 bfd_hash_lookup (&definedness_table, name, true, false); 313 314 if (defentry == NULL) 315 einfo (_("%F%P: bfd_hash_lookup failed creating symbol %s\n"), name); 316 317 /* If the symbol was already defined, and not by a script, then it 318 must be defined by an object file or by the linker target code. */ 319 ret = true; 320 if (!h->ldscript_def 321 && (h->type == bfd_link_hash_defined 322 || h->type == bfd_link_hash_defweak 323 || h->type == bfd_link_hash_common)) 324 { 325 defentry->by_object = 1; 326 if (h->type == bfd_link_hash_defined 327 && h->u.def.section->output_section != NULL 328 && !bfd_is_abs_section (h->u.def.section) 329 && !h->linker_def) 330 ret = false; 331 } 332 333 defentry->iteration = lang_statement_iteration; 334 defentry->final_sec = bfd_abs_section_ptr; 335 if (expld.phase == lang_final_phase_enum 336 && expld.rel_from_abs 337 && expld.result.section == bfd_abs_section_ptr) 338 defentry->final_sec = section_for_dot (); 339 return ret; 340 } 341 342 static void 343 fold_segment_end (void) 344 { 345 seg_align_type *seg = &expld.dataseg; 346 347 if (expld.phase == lang_first_phase_enum 348 || expld.section != bfd_abs_section_ptr) 349 { 350 expld.result.valid_p = false; 351 } 352 else if (seg->phase == exp_seg_align_seen 353 || seg->phase == exp_seg_relro_seen) 354 { 355 seg->phase = exp_seg_end_seen; 356 seg->end = expld.result.value; 357 } 358 else if (seg->phase == exp_seg_done 359 || seg->phase == exp_seg_adjust 360 || seg->phase == exp_seg_relro_adjust) 361 { 362 /* OK. */ 363 } 364 else 365 expld.result.valid_p = false; 366 } 367 368 static void 369 fold_unary (etree_type *tree) 370 { 371 exp_fold_tree_1 (tree->unary.child); 372 if (expld.result.valid_p) 373 { 374 switch (tree->type.node_code) 375 { 376 case ALIGN_K: 377 if (expld.phase != lang_first_phase_enum) 378 new_rel_from_abs (align_n (expld.dot, expld.result.value)); 379 else 380 expld.result.valid_p = false; 381 break; 382 383 case ABSOLUTE: 384 make_abs (); 385 break; 386 387 case LOG2CEIL: 388 make_log2ceil (); 389 break; 390 391 case '~': 392 expld.result.value = ~expld.result.value; 393 break; 394 395 case '!': 396 expld.result.value = !expld.result.value; 397 break; 398 399 case '-': 400 expld.result.value = -expld.result.value; 401 break; 402 403 case NEXT: 404 /* Return next place aligned to value. */ 405 if (expld.phase != lang_first_phase_enum) 406 { 407 make_abs (); 408 expld.result.value = align_n (expld.dot, expld.result.value); 409 } 410 else 411 expld.result.valid_p = false; 412 break; 413 414 case DATA_SEGMENT_END: 415 fold_segment_end (); 416 break; 417 418 default: 419 FAIL (); 420 break; 421 } 422 } 423 } 424 425 /* Arithmetic operators, bitwise AND, bitwise OR and XOR keep the 426 section of one of their operands only when the other operand is a 427 plain number. Losing the section when operating on two symbols, 428 ie. a result of a plain number, is required for subtraction and 429 XOR. It's justifiable for the other operations on the grounds that 430 adding, multiplying etc. two section relative values does not 431 really make sense unless they are just treated as numbers. 432 The same argument could be made for many expressions involving one 433 symbol and a number. For example, "1 << x" and "100 / x" probably 434 should not be given the section of x. The trouble is that if we 435 fuss about such things the rules become complex and it is onerous 436 to document ld expression evaluation. */ 437 static void 438 arith_result_section (const etree_value_type *lhs) 439 { 440 if (expld.result.section == lhs->section) 441 { 442 if (expld.section == bfd_abs_section_ptr 443 && !config.sane_expr) 444 /* Duplicate the insanity in exp_fold_tree_1 case etree_value. */ 445 expld.result.section = bfd_abs_section_ptr; 446 else 447 expld.result.section = NULL; 448 } 449 } 450 451 static void 452 fold_segment_align (etree_value_type *lhs) 453 { 454 seg_align_type *seg = &expld.dataseg; 455 456 seg->relro = exp_seg_relro_start; 457 if (expld.phase == lang_first_phase_enum 458 || expld.section != bfd_abs_section_ptr) 459 expld.result.valid_p = false; 460 else 461 { 462 bfd_vma maxpage = lhs->value; 463 bfd_vma commonpage = expld.result.value; 464 465 expld.result.value = align_n (expld.dot, maxpage); 466 if (seg->phase == exp_seg_relro_adjust) 467 expld.result.value = seg->base; 468 else if (seg->phase == exp_seg_adjust) 469 { 470 if (commonpage < maxpage) 471 expld.result.value += ((expld.dot + commonpage - 1) 472 & (maxpage - commonpage)); 473 } 474 else 475 { 476 if (!link_info.relro) 477 expld.result.value += expld.dot & (maxpage - 1); 478 if (seg->phase == exp_seg_done) 479 { 480 /* OK. */ 481 } 482 else if (seg->phase == exp_seg_none) 483 { 484 seg->phase = exp_seg_align_seen; 485 seg->base = expld.result.value; 486 seg->commonpagesize = commonpage; 487 seg->maxpagesize = maxpage; 488 seg->relropagesize = maxpage; 489 seg->relro_end = 0; 490 } 491 else 492 expld.result.valid_p = false; 493 } 494 } 495 } 496 497 static void 498 fold_segment_relro_end (etree_value_type *lhs) 499 { 500 seg_align_type *seg = &expld.dataseg; 501 502 /* Operands swapped! XXX_SEGMENT_RELRO_END(offset,exp) has offset 503 in expld.result and exp in lhs. */ 504 seg->relro = exp_seg_relro_end; 505 seg->relro_offset = expld.result.value; 506 if (expld.phase == lang_first_phase_enum 507 || expld.section != bfd_abs_section_ptr) 508 expld.result.valid_p = false; 509 else if (seg->phase == exp_seg_align_seen 510 || seg->phase == exp_seg_adjust 511 || seg->phase == exp_seg_relro_adjust 512 || seg->phase == exp_seg_done) 513 { 514 if (seg->phase == exp_seg_align_seen 515 || seg->phase == exp_seg_relro_adjust) 516 seg->relro_end = lhs->value + expld.result.value; 517 518 if (seg->phase == exp_seg_relro_adjust 519 && (seg->relro_end & (seg->relropagesize - 1))) 520 { 521 seg->relro_end += seg->relropagesize - 1; 522 seg->relro_end &= ~(seg->relropagesize - 1); 523 expld.result.value = seg->relro_end - expld.result.value; 524 } 525 else 526 expld.result.value = lhs->value; 527 528 if (seg->phase == exp_seg_align_seen) 529 seg->phase = exp_seg_relro_seen; 530 } 531 else 532 expld.result.valid_p = false; 533 } 534 535 static void 536 fold_binary (etree_type *tree) 537 { 538 etree_value_type lhs; 539 exp_fold_tree_1 (tree->binary.lhs); 540 541 /* The SEGMENT_START operator is special because its first 542 operand is a string, not the name of a symbol. Note that the 543 operands have been swapped, so binary.lhs is second (default) 544 operand, binary.rhs is first operand. */ 545 if (expld.result.valid_p && tree->type.node_code == SEGMENT_START) 546 { 547 bfd_vma value = expld.result.value; 548 const char *segment_name; 549 segment_type *seg; 550 551 /* Check to see if the user has overridden the default 552 value. */ 553 segment_name = tree->binary.rhs->name.name; 554 for (seg = segments; seg; seg = seg->next) 555 if (strcmp (seg->name, segment_name) == 0) 556 { 557 if (!seg->used 558 && config.magic_demand_paged 559 && link_info.maxpagesize != 0 560 && (seg->value % link_info.maxpagesize) != 0) 561 einfo (_("%P: warning: address of `%s' " 562 "isn't multiple of maximum page size\n"), 563 segment_name); 564 seg->used = true; 565 value = seg->value; 566 break; 567 } 568 new_rel_from_abs (value); 569 return; 570 } 571 572 lhs = expld.result; 573 exp_fold_tree_1 (tree->binary.rhs); 574 expld.result.valid_p &= lhs.valid_p; 575 576 if (expld.result.valid_p) 577 { 578 if (lhs.section != expld.result.section) 579 { 580 /* If the values are from different sections, and neither is 581 just a number, make both the source arguments absolute. */ 582 if (expld.result.section != NULL 583 && lhs.section != NULL) 584 { 585 make_abs (); 586 lhs.value += lhs.section->vma; 587 lhs.section = bfd_abs_section_ptr; 588 } 589 590 /* If the rhs is just a number, keep the lhs section. */ 591 else if (expld.result.section == NULL) 592 { 593 expld.result.section = lhs.section; 594 /* Make this NULL so that we know one of the operands 595 was just a number, for later tests. */ 596 lhs.section = NULL; 597 } 598 } 599 /* At this point we know that both operands have the same 600 section, or at least one of them is a plain number. */ 601 602 switch (tree->type.node_code) 603 { 604 #define BOP(x, y) \ 605 case x: \ 606 expld.result.value = lhs.value y expld.result.value; \ 607 arith_result_section (&lhs); \ 608 break; 609 610 /* Comparison operators, logical AND, and logical OR always 611 return a plain number. */ 612 #define BOPN(x, y) \ 613 case x: \ 614 expld.result.value = lhs.value y expld.result.value; \ 615 expld.result.section = NULL; \ 616 break; 617 618 BOP ('+', +); 619 BOP ('*', *); 620 BOP ('-', -); 621 BOP (LSHIFT, <<); 622 BOP (RSHIFT, >>); 623 BOP ('&', &); 624 BOP ('^', ^); 625 BOP ('|', |); 626 BOPN (EQ, ==); 627 BOPN (NE, !=); 628 BOPN ('<', <); 629 BOPN ('>', >); 630 BOPN (LE, <=); 631 BOPN (GE, >=); 632 BOPN (ANDAND, &&); 633 BOPN (OROR, ||); 634 635 case '%': 636 if (expld.result.value != 0) 637 expld.result.value = ((bfd_signed_vma) lhs.value 638 % (bfd_signed_vma) expld.result.value); 639 else if (expld.phase != lang_mark_phase_enum) 640 einfo (_("%F%P:%pS %% by zero\n"), tree->binary.rhs); 641 arith_result_section (&lhs); 642 break; 643 644 case '/': 645 if (expld.result.value != 0) 646 expld.result.value = ((bfd_signed_vma) lhs.value 647 / (bfd_signed_vma) expld.result.value); 648 else if (expld.phase != lang_mark_phase_enum) 649 einfo (_("%F%P:%pS / by zero\n"), tree->binary.rhs); 650 arith_result_section (&lhs); 651 break; 652 653 case MAX_K: 654 if (lhs.value > expld.result.value) 655 expld.result.value = lhs.value; 656 break; 657 658 case MIN_K: 659 if (lhs.value < expld.result.value) 660 expld.result.value = lhs.value; 661 break; 662 663 case ALIGN_K: 664 expld.result.value = align_n (lhs.value, expld.result.value); 665 break; 666 667 case DATA_SEGMENT_ALIGN: 668 fold_segment_align (&lhs); 669 break; 670 671 case DATA_SEGMENT_RELRO_END: 672 fold_segment_relro_end (&lhs); 673 break; 674 675 default: 676 FAIL (); 677 } 678 } 679 } 680 681 static void 682 fold_trinary (etree_type *tree) 683 { 684 struct bfd_link_hash_entry *save = expld.assign_src; 685 686 exp_fold_tree_1 (tree->trinary.cond); 687 expld.assign_src = save; 688 if (expld.result.valid_p) 689 exp_fold_tree_1 (expld.result.value 690 ? tree->trinary.lhs 691 : tree->trinary.rhs); 692 } 693 694 static void 695 fold_name (etree_type *tree) 696 { 697 struct bfd_link_hash_entry *h; 698 struct definedness_hash_entry *def; 699 700 memset (&expld.result, 0, sizeof (expld.result)); 701 702 switch (tree->type.node_code) 703 { 704 case SIZEOF_HEADERS: 705 link_info.load_phdrs = 1; 706 if (expld.phase != lang_first_phase_enum) 707 { 708 bfd_vma hdr_size = 0; 709 /* Don't find the real header size if only marking sections; 710 The bfd function may cache incorrect data. */ 711 if (expld.phase != lang_mark_phase_enum) 712 hdr_size = (bfd_sizeof_headers (link_info.output_bfd, &link_info) 713 / bfd_octets_per_byte (link_info.output_bfd, NULL)); 714 new_number (hdr_size); 715 } 716 break; 717 718 case DEFINED: 719 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd, 720 &link_info, 721 tree->name.name, 722 false, false, true); 723 new_number (h != NULL 724 && (h->type == bfd_link_hash_defined 725 || h->type == bfd_link_hash_defweak 726 || h->type == bfd_link_hash_common) 727 && (!h->ldscript_def 728 || (def = symbol_defined (tree->name.name)) == NULL 729 || def->by_object 730 || def->iteration == (lang_statement_iteration & 255))); 731 break; 732 733 case NAME: 734 if (tree->name.name[0] == '.' && tree->name.name[1] == 0) 735 new_rel_from_abs (expld.dot); 736 else 737 { 738 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd, 739 &link_info, 740 tree->name.name, 741 true, false, true); 742 if (!h) 743 { 744 if (expld.phase != lang_first_phase_enum) 745 einfo (_("%F%P: bfd_link_hash_lookup failed: %E\n")); 746 } 747 else if (h->type == bfd_link_hash_defined 748 || h->type == bfd_link_hash_defweak) 749 { 750 asection *output_section; 751 752 output_section = h->u.def.section->output_section; 753 if (output_section == NULL) 754 { 755 if (expld.phase <= lang_mark_phase_enum) 756 new_rel (h->u.def.value, h->u.def.section); 757 else 758 einfo (_("%X%P:%pS: unresolvable symbol `%s'" 759 " referenced in expression\n"), 760 tree, tree->name.name); 761 } 762 else if (output_section == bfd_abs_section_ptr 763 && (expld.section != bfd_abs_section_ptr 764 || config.sane_expr)) 765 new_number (h->u.def.value + h->u.def.section->output_offset); 766 else 767 new_rel (h->u.def.value + h->u.def.section->output_offset, 768 output_section); 769 } 770 else if (expld.phase == lang_final_phase_enum 771 || (expld.phase != lang_mark_phase_enum 772 && expld.assigning_to_dot)) 773 einfo (_("%F%P:%pS: undefined symbol `%s'" 774 " referenced in expression\n"), 775 tree, tree->name.name); 776 else if (h->type == bfd_link_hash_new) 777 { 778 h->type = bfd_link_hash_undefined; 779 h->u.undef.abfd = NULL; 780 if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail) 781 bfd_link_add_undef (link_info.hash, h); 782 } 783 if (expld.assign_src == NULL) 784 expld.assign_src = h; 785 else 786 expld.assign_src = (struct bfd_link_hash_entry *) - 1; 787 788 /* Self-assignment is only allowed for absolute symbols 789 defined in a linker script. */ 790 if (expld.assign_name != NULL 791 && strcmp (expld.assign_name, tree->name.name) == 0 792 && !(h != NULL 793 && (h->type == bfd_link_hash_defined 794 || h->type == bfd_link_hash_defweak) 795 && h->u.def.section == bfd_abs_section_ptr 796 && (def = symbol_defined (tree->name.name)) != NULL 797 && def->iteration == (lang_statement_iteration & 255))) 798 expld.assign_name = NULL; 799 } 800 break; 801 802 case ADDR: 803 if (expld.phase != lang_first_phase_enum) 804 { 805 lang_output_section_statement_type *os; 806 807 os = lang_output_section_find (tree->name.name); 808 if (os == NULL) 809 { 810 if (expld.phase == lang_final_phase_enum) 811 einfo (_("%F%P:%pS: undefined section `%s'" 812 " referenced in expression\n"), 813 tree, tree->name.name); 814 } 815 else if (os->processed_vma) 816 new_rel (0, os->bfd_section); 817 } 818 break; 819 820 case LOADADDR: 821 if (expld.phase != lang_first_phase_enum) 822 { 823 lang_output_section_statement_type *os; 824 825 os = lang_output_section_find (tree->name.name); 826 if (os == NULL) 827 { 828 if (expld.phase == lang_final_phase_enum) 829 einfo (_("%F%P:%pS: undefined section `%s'" 830 " referenced in expression\n"), 831 tree, tree->name.name); 832 } 833 else if (os->processed_lma) 834 { 835 if (os->load_base == NULL) 836 new_abs (os->bfd_section->lma); 837 else 838 { 839 exp_fold_tree_1 (os->load_base); 840 if (expld.result.valid_p) 841 make_abs (); 842 } 843 } 844 } 845 break; 846 847 case SIZEOF: 848 case ALIGNOF: 849 if (expld.phase != lang_first_phase_enum) 850 { 851 lang_output_section_statement_type *os; 852 853 os = lang_output_section_find (tree->name.name); 854 if (os == NULL) 855 { 856 if (expld.phase == lang_final_phase_enum) 857 einfo (_("%F%P:%pS: undefined section `%s'" 858 " referenced in expression\n"), 859 tree, tree->name.name); 860 new_number (0); 861 } 862 else if (os->bfd_section != NULL) 863 { 864 bfd_vma val; 865 866 if (tree->type.node_code == SIZEOF) 867 { 868 if (os->processed_vma) 869 val = os->bfd_section->size; 870 else 871 /* If we've just called lang_reset_memory_regions, 872 size will be zero and a previous estimate of 873 size will be in rawsize. */ 874 val = os->bfd_section->rawsize; 875 val /= bfd_octets_per_byte (link_info.output_bfd, 876 os->bfd_section); 877 } 878 else 879 val = (bfd_vma)1 << os->bfd_section->alignment_power; 880 881 new_number (val); 882 } 883 else 884 new_number (0); 885 } 886 break; 887 888 case LENGTH: 889 { 890 lang_memory_region_type *mem; 891 892 mem = lang_memory_region_lookup (tree->name.name, false); 893 if (mem != NULL) 894 new_number (mem->length); 895 else 896 einfo (_("%F%P:%pS: undefined MEMORY region `%s'" 897 " referenced in expression\n"), 898 tree, tree->name.name); 899 } 900 break; 901 902 case ORIGIN: 903 { 904 lang_memory_region_type *mem; 905 906 mem = lang_memory_region_lookup (tree->name.name, false); 907 if (mem != NULL) 908 new_rel_from_abs (mem->origin); 909 else 910 einfo (_("%F%P:%pS: undefined MEMORY region `%s'" 911 " referenced in expression\n"), 912 tree, tree->name.name); 913 } 914 break; 915 916 case CONSTANT: 917 if (strcmp (tree->name.name, "MAXPAGESIZE") == 0) 918 new_number (link_info.maxpagesize); 919 else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0) 920 new_number (link_info.commonpagesize); 921 else 922 einfo (_("%F%P:%pS: unknown constant `%s' referenced in expression\n"), 923 tree, tree->name.name); 924 break; 925 926 default: 927 FAIL (); 928 break; 929 } 930 } 931 932 /* Return true if TREE is '.'. */ 933 934 static bool 935 is_dot (const etree_type *tree) 936 { 937 return (tree->type.node_class == etree_name 938 && tree->type.node_code == NAME 939 && tree->name.name[0] == '.' 940 && tree->name.name[1] == 0); 941 } 942 943 /* Return true if TREE is a constant equal to VAL. */ 944 945 static bool 946 is_value (const etree_type *tree, bfd_vma val) 947 { 948 return (tree->type.node_class == etree_value 949 && tree->value.value == val); 950 } 951 952 /* Return true if TREE is an absolute symbol equal to VAL defined in 953 a linker script. */ 954 955 static bool 956 is_sym_value (const etree_type *tree, bfd_vma val) 957 { 958 struct bfd_link_hash_entry *h; 959 struct definedness_hash_entry *def; 960 961 return (tree->type.node_class == etree_name 962 && tree->type.node_code == NAME 963 && (def = symbol_defined (tree->name.name)) != NULL 964 && def->iteration == (lang_statement_iteration & 255) 965 && (h = bfd_wrapped_link_hash_lookup (link_info.output_bfd, 966 &link_info, 967 tree->name.name, 968 false, false, true)) != NULL 969 && h->ldscript_def 970 && h->type == bfd_link_hash_defined 971 && h->u.def.section == bfd_abs_section_ptr 972 && h->u.def.value == val); 973 } 974 975 /* Return true if TREE is ". != 0". */ 976 977 static bool 978 is_dot_ne_0 (const etree_type *tree) 979 { 980 return (tree->type.node_class == etree_binary 981 && tree->type.node_code == NE 982 && is_dot (tree->binary.lhs) 983 && is_value (tree->binary.rhs, 0)); 984 } 985 986 /* Return true if TREE is ". = . + 0" or ". = . + sym" where sym is an 987 absolute constant with value 0 defined in a linker script. */ 988 989 static bool 990 is_dot_plus_0 (const etree_type *tree) 991 { 992 return (tree->type.node_class == etree_binary 993 && tree->type.node_code == '+' 994 && is_dot (tree->binary.lhs) 995 && (is_value (tree->binary.rhs, 0) 996 || is_sym_value (tree->binary.rhs, 0))); 997 } 998 999 /* Return true if TREE is "ALIGN (. != 0 ? some_expression : 1)". */ 1000 1001 static bool 1002 is_align_conditional (const etree_type *tree) 1003 { 1004 if (tree->type.node_class == etree_unary 1005 && tree->type.node_code == ALIGN_K) 1006 { 1007 tree = tree->unary.child; 1008 return (tree->type.node_class == etree_trinary 1009 && is_dot_ne_0 (tree->trinary.cond) 1010 && is_value (tree->trinary.rhs, 1)); 1011 } 1012 return false; 1013 } 1014 1015 static void 1016 exp_fold_tree_1 (etree_type *tree) 1017 { 1018 if (tree == NULL) 1019 { 1020 memset (&expld.result, 0, sizeof (expld.result)); 1021 return; 1022 } 1023 1024 switch (tree->type.node_class) 1025 { 1026 case etree_value: 1027 if (expld.section == bfd_abs_section_ptr 1028 && !config.sane_expr) 1029 new_abs (tree->value.value); 1030 else 1031 new_number (tree->value.value); 1032 expld.result.str = tree->value.str; 1033 break; 1034 1035 case etree_rel: 1036 if (expld.phase != lang_first_phase_enum) 1037 { 1038 asection *output_section = tree->rel.section->output_section; 1039 new_rel (tree->rel.value + tree->rel.section->output_offset, 1040 output_section); 1041 } 1042 else 1043 memset (&expld.result, 0, sizeof (expld.result)); 1044 break; 1045 1046 case etree_assert: 1047 exp_fold_tree_1 (tree->assert_s.child); 1048 if (expld.phase == lang_final_phase_enum && !expld.result.value) 1049 einfo ("%X%P: %s\n", tree->assert_s.message); 1050 break; 1051 1052 case etree_unary: 1053 fold_unary (tree); 1054 break; 1055 1056 case etree_binary: 1057 fold_binary (tree); 1058 break; 1059 1060 case etree_trinary: 1061 fold_trinary (tree); 1062 break; 1063 1064 case etree_assign: 1065 case etree_provide: 1066 case etree_provided: 1067 if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0) 1068 { 1069 if (tree->type.node_class != etree_assign) 1070 einfo (_("%F%P:%pS can not PROVIDE assignment to" 1071 " location counter\n"), tree); 1072 if (expld.phase != lang_first_phase_enum) 1073 { 1074 /* Notify the folder that this is an assignment to dot. */ 1075 expld.assigning_to_dot = true; 1076 exp_fold_tree_1 (tree->assign.src); 1077 expld.assigning_to_dot = false; 1078 1079 /* If we are assigning to dot inside an output section 1080 arrange to keep the section, except for certain 1081 expressions that evaluate to zero. We ignore . = 0, 1082 . = . + 0, and . = ALIGN (. != 0 ? expr : 1). 1083 We can't ignore all expressions that evaluate to zero 1084 because an otherwise empty section might have padding 1085 added by an alignment expression that changes with 1086 relaxation. Such a section might have zero size 1087 before relaxation and so be stripped incorrectly. */ 1088 if (expld.phase == lang_mark_phase_enum 1089 && expld.section != bfd_abs_section_ptr 1090 && expld.section != bfd_und_section_ptr 1091 && !(expld.result.valid_p 1092 && expld.result.value == 0 1093 && (is_value (tree->assign.src, 0) 1094 || is_sym_value (tree->assign.src, 0) 1095 || is_dot_plus_0 (tree->assign.src) 1096 || is_align_conditional (tree->assign.src)))) 1097 expld.section->flags |= SEC_KEEP; 1098 1099 if (!expld.result.valid_p 1100 || expld.section == bfd_und_section_ptr) 1101 { 1102 if (expld.phase != lang_mark_phase_enum) 1103 einfo (_("%F%P:%pS invalid assignment to" 1104 " location counter\n"), tree); 1105 } 1106 else if (expld.dotp == NULL) 1107 einfo (_("%F%P:%pS assignment to location counter" 1108 " invalid outside of SECTIONS\n"), tree); 1109 1110 /* After allocation, assignment to dot should not be 1111 done inside an output section since allocation adds a 1112 padding statement that effectively duplicates the 1113 assignment. */ 1114 else if (expld.phase <= lang_allocating_phase_enum 1115 || expld.section == bfd_abs_section_ptr) 1116 { 1117 bfd_vma nextdot; 1118 1119 nextdot = expld.result.value; 1120 if (expld.result.section != NULL) 1121 nextdot += expld.result.section->vma; 1122 else 1123 nextdot += expld.section->vma; 1124 if (nextdot < expld.dot 1125 && expld.section != bfd_abs_section_ptr) 1126 einfo (_("%F%P:%pS cannot move location counter backwards" 1127 " (from %V to %V)\n"), 1128 tree, expld.dot, nextdot); 1129 else 1130 { 1131 expld.dot = nextdot; 1132 *expld.dotp = nextdot; 1133 } 1134 } 1135 } 1136 else 1137 memset (&expld.result, 0, sizeof (expld.result)); 1138 } 1139 else 1140 { 1141 struct bfd_link_hash_entry *h = NULL; 1142 1143 if (tree->type.node_class == etree_provide) 1144 { 1145 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst, 1146 false, false, true); 1147 if (h == NULL 1148 || !(h->type == bfd_link_hash_new 1149 || h->type == bfd_link_hash_undefined 1150 || h->type == bfd_link_hash_undefweak 1151 || h->linker_def)) 1152 { 1153 /* Do nothing. The symbol was never referenced, or 1154 was defined in some object file. Note that 1155 undefweak symbols are defined by PROVIDE. This 1156 is to support glibc use of __rela_iplt_start and 1157 similar weak references. */ 1158 break; 1159 } 1160 } 1161 1162 expld.assign_name = tree->assign.dst; 1163 expld.assign_src = NULL; 1164 exp_fold_tree_1 (tree->assign.src); 1165 /* expld.assign_name remaining equal to tree->assign.dst 1166 below indicates the evaluation of tree->assign.src did 1167 not use the value of tree->assign.dst. We don't allow 1168 self assignment until the final phase for two reasons: 1169 1) Expressions are evaluated multiple times. With 1170 relaxation, the number of times may vary. 1171 2) Section relative symbol values cannot be correctly 1172 converted to absolute values, as is required by many 1173 expressions, until final section sizing is complete. */ 1174 if (expld.phase == lang_final_phase_enum 1175 || expld.phase == lang_fixed_phase_enum 1176 || expld.assign_name != NULL) 1177 { 1178 if (tree->type.node_class == etree_provide) 1179 tree->type.node_class = etree_provided; 1180 1181 if (h == NULL) 1182 { 1183 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst, 1184 true, false, true); 1185 if (h == NULL) 1186 einfo (_("%F%P:%s: hash creation failed\n"), 1187 tree->assign.dst); 1188 } 1189 1190 /* If the expression is not valid then fake a zero value. In 1191 the final phase any errors will already have been raised, 1192 in earlier phases we want to create this definition so 1193 that it can be seen by other expressions. */ 1194 if (!expld.result.valid_p 1195 && h->type == bfd_link_hash_new) 1196 { 1197 expld.result.value = 0; 1198 expld.result.section = NULL; 1199 expld.result.valid_p = true; 1200 } 1201 1202 if (expld.result.valid_p) 1203 { 1204 if (expld.result.section == NULL) 1205 expld.result.section = expld.section; 1206 if (!update_definedness (tree->assign.dst, h) 1207 && expld.assign_name != NULL) 1208 { 1209 /* Symbol was already defined, and the script isn't 1210 modifying the symbol value for some reason as in 1211 ld-elf/var1 and ld-scripts/pr14962. 1212 For now this is only a warning. */ 1213 unsigned int warn = link_info.warn_multiple_definition; 1214 link_info.warn_multiple_definition = 1; 1215 (*link_info.callbacks->multiple_definition) 1216 (&link_info, h, link_info.output_bfd, 1217 expld.result.section, expld.result.value); 1218 link_info.warn_multiple_definition = warn; 1219 } 1220 if (expld.phase == lang_fixed_phase_enum) 1221 { 1222 if (h->type == bfd_link_hash_defined) 1223 { 1224 expld.result.value = h->u.def.value; 1225 expld.result.section = h->u.def.section; 1226 } 1227 } 1228 else 1229 { 1230 h->type = bfd_link_hash_defined; 1231 h->u.def.value = expld.result.value; 1232 h->u.def.section = expld.result.section; 1233 h->linker_def = ! tree->assign.type.lineno; 1234 h->ldscript_def = 1; 1235 h->rel_from_abs = expld.rel_from_abs; 1236 if (tree->assign.hidden) 1237 bfd_link_hide_symbol (link_info.output_bfd, 1238 &link_info, h); 1239 1240 /* Copy the symbol type and set non_ir_ref_regular 1241 on the source if this is an expression only 1242 referencing a single symbol. (If the expression 1243 contains ternary conditions, ignoring symbols on 1244 false branches.) */ 1245 if (expld.assign_src != NULL 1246 && (expld.assign_src 1247 != (struct bfd_link_hash_entry *) -1)) 1248 { 1249 bfd_copy_link_hash_symbol_type (link_info.output_bfd, 1250 h, expld.assign_src); 1251 expld.assign_src->non_ir_ref_regular = true; 1252 } 1253 } 1254 } 1255 } 1256 if (expld.phase != lang_fixed_phase_enum) 1257 expld.assign_name = NULL; 1258 } 1259 break; 1260 1261 case etree_name: 1262 fold_name (tree); 1263 break; 1264 1265 default: 1266 FAIL (); 1267 memset (&expld.result, 0, sizeof (expld.result)); 1268 break; 1269 } 1270 } 1271 1272 void 1273 exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp) 1274 { 1275 expld.rel_from_abs = false; 1276 expld.dot = *dotp; 1277 expld.dotp = dotp; 1278 expld.section = current_section; 1279 exp_fold_tree_1 (tree); 1280 } 1281 1282 void 1283 exp_fold_tree_no_dot (etree_type *tree) 1284 { 1285 expld.rel_from_abs = false; 1286 expld.dot = 0; 1287 expld.dotp = NULL; 1288 expld.section = bfd_abs_section_ptr; 1289 exp_fold_tree_1 (tree); 1290 } 1291 1292 static void 1293 exp_value_fold (etree_type *tree) 1294 { 1295 exp_fold_tree_no_dot (tree); 1296 if (expld.result.valid_p) 1297 { 1298 tree->type.node_code = INT; 1299 tree->value.value = expld.result.value; 1300 tree->value.str = NULL; 1301 tree->type.node_class = etree_value; 1302 } 1303 } 1304 1305 #define MAX(a, b) ((a) > (b) ? (a) : (b)) 1306 1307 etree_type * 1308 exp_binop (int code, etree_type *lhs, etree_type *rhs) 1309 { 1310 etree_type *new_e = stat_alloc (MAX (sizeof (new_e->binary), 1311 sizeof (new_e->value))); 1312 new_e->type.node_code = code; 1313 new_e->type.filename = lhs->type.filename; 1314 new_e->type.lineno = lhs->type.lineno; 1315 new_e->binary.lhs = lhs; 1316 new_e->binary.rhs = rhs; 1317 new_e->type.node_class = etree_binary; 1318 if (lhs->type.node_class == etree_value 1319 && rhs->type.node_class == etree_value 1320 && code != ALIGN_K 1321 && code != DATA_SEGMENT_ALIGN 1322 && code != DATA_SEGMENT_RELRO_END) 1323 exp_value_fold (new_e); 1324 return new_e; 1325 } 1326 1327 etree_type * 1328 exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs) 1329 { 1330 etree_type *new_e = stat_alloc (MAX (sizeof (new_e->trinary), 1331 sizeof (new_e->value))); 1332 new_e->type.node_code = code; 1333 new_e->type.filename = cond->type.filename; 1334 new_e->type.lineno = cond->type.lineno; 1335 new_e->trinary.lhs = lhs; 1336 new_e->trinary.cond = cond; 1337 new_e->trinary.rhs = rhs; 1338 new_e->type.node_class = etree_trinary; 1339 if (cond->type.node_class == etree_value 1340 && lhs->type.node_class == etree_value 1341 && rhs->type.node_class == etree_value) 1342 exp_value_fold (new_e); 1343 return new_e; 1344 } 1345 1346 etree_type * 1347 exp_unop (int code, etree_type *child) 1348 { 1349 etree_type *new_e = stat_alloc (MAX (sizeof (new_e->unary), 1350 sizeof (new_e->value))); 1351 new_e->unary.type.node_code = code; 1352 new_e->unary.type.filename = child->type.filename; 1353 new_e->unary.type.lineno = child->type.lineno; 1354 new_e->unary.child = child; 1355 new_e->unary.type.node_class = etree_unary; 1356 if (child->type.node_class == etree_value 1357 && code != ALIGN_K 1358 && code != ABSOLUTE 1359 && code != NEXT 1360 && code != DATA_SEGMENT_END) 1361 exp_value_fold (new_e); 1362 return new_e; 1363 } 1364 1365 etree_type * 1366 exp_nameop (int code, const char *name) 1367 { 1368 etree_type *new_e = stat_alloc (sizeof (new_e->name)); 1369 1370 new_e->name.type.node_code = code; 1371 new_e->name.type.filename = ldlex_filename (); 1372 new_e->name.type.lineno = lineno; 1373 new_e->name.name = name; 1374 new_e->name.type.node_class = etree_name; 1375 return new_e; 1376 1377 } 1378 1379 static etree_type * 1380 exp_assop (const char *dst, 1381 etree_type *src, 1382 enum node_tree_enum class, 1383 bool hidden) 1384 { 1385 etree_type *n; 1386 1387 n = stat_alloc (sizeof (n->assign)); 1388 n->assign.type.node_code = '='; 1389 n->assign.type.filename = src->type.filename; 1390 n->assign.type.lineno = src->type.lineno; 1391 n->assign.type.node_class = class; 1392 n->assign.src = src; 1393 n->assign.dst = dst; 1394 n->assign.hidden = hidden; 1395 return n; 1396 } 1397 1398 /* Handle linker script assignments and HIDDEN. */ 1399 1400 etree_type * 1401 exp_assign (const char *dst, etree_type *src, bool hidden) 1402 { 1403 return exp_assop (dst, src, etree_assign, hidden); 1404 } 1405 1406 /* Handle --defsym command-line option. */ 1407 1408 etree_type * 1409 exp_defsym (const char *dst, etree_type *src) 1410 { 1411 return exp_assop (dst, src, etree_assign, false); 1412 } 1413 1414 /* Handle PROVIDE. */ 1415 1416 etree_type * 1417 exp_provide (const char *dst, etree_type *src, bool hidden) 1418 { 1419 return exp_assop (dst, src, etree_provide, hidden); 1420 } 1421 1422 /* Handle ASSERT. */ 1423 1424 etree_type * 1425 exp_assert (etree_type *exp, const char *message) 1426 { 1427 etree_type *n; 1428 1429 n = stat_alloc (sizeof (n->assert_s)); 1430 n->assert_s.type.node_code = '!'; 1431 n->assert_s.type.filename = exp->type.filename; 1432 n->assert_s.type.lineno = exp->type.lineno; 1433 n->assert_s.type.node_class = etree_assert; 1434 n->assert_s.child = exp; 1435 n->assert_s.message = message; 1436 return n; 1437 } 1438 1439 void 1440 exp_print_tree (etree_type *tree) 1441 { 1442 bool function_like; 1443 1444 if (config.map_file == NULL) 1445 config.map_file = stderr; 1446 1447 if (tree == NULL) 1448 { 1449 minfo ("NULL TREE\n"); 1450 return; 1451 } 1452 1453 switch (tree->type.node_class) 1454 { 1455 case etree_value: 1456 minfo ("0x%v", tree->value.value); 1457 return; 1458 case etree_rel: 1459 if (tree->rel.section->owner != NULL) 1460 minfo ("%pB:", tree->rel.section->owner); 1461 minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value); 1462 return; 1463 case etree_assign: 1464 fputs (tree->assign.dst, config.map_file); 1465 exp_print_token (tree->type.node_code, true); 1466 exp_print_tree (tree->assign.src); 1467 break; 1468 case etree_provide: 1469 case etree_provided: 1470 fprintf (config.map_file, "PROVIDE (%s = ", tree->assign.dst); 1471 exp_print_tree (tree->assign.src); 1472 fputc (')', config.map_file); 1473 break; 1474 case etree_binary: 1475 function_like = false; 1476 switch (tree->type.node_code) 1477 { 1478 case MAX_K: 1479 case MIN_K: 1480 case ALIGN_K: 1481 case DATA_SEGMENT_ALIGN: 1482 case DATA_SEGMENT_RELRO_END: 1483 function_like = true; 1484 break; 1485 case SEGMENT_START: 1486 /* Special handling because arguments are in reverse order and 1487 the segment name is quoted. */ 1488 exp_print_token (tree->type.node_code, false); 1489 fputs (" (\"", config.map_file); 1490 exp_print_tree (tree->binary.rhs); 1491 fputs ("\", ", config.map_file); 1492 exp_print_tree (tree->binary.lhs); 1493 fputc (')', config.map_file); 1494 return; 1495 } 1496 if (function_like) 1497 { 1498 exp_print_token (tree->type.node_code, false); 1499 fputc (' ', config.map_file); 1500 } 1501 fputc ('(', config.map_file); 1502 exp_print_tree (tree->binary.lhs); 1503 if (function_like) 1504 fprintf (config.map_file, ", "); 1505 else 1506 exp_print_token (tree->type.node_code, true); 1507 exp_print_tree (tree->binary.rhs); 1508 fputc (')', config.map_file); 1509 break; 1510 case etree_trinary: 1511 exp_print_tree (tree->trinary.cond); 1512 fputc ('?', config.map_file); 1513 exp_print_tree (tree->trinary.lhs); 1514 fputc (':', config.map_file); 1515 exp_print_tree (tree->trinary.rhs); 1516 break; 1517 case etree_unary: 1518 exp_print_token (tree->unary.type.node_code, false); 1519 if (tree->unary.child) 1520 { 1521 fprintf (config.map_file, " ("); 1522 exp_print_tree (tree->unary.child); 1523 fputc (')', config.map_file); 1524 } 1525 break; 1526 1527 case etree_assert: 1528 fprintf (config.map_file, "ASSERT ("); 1529 exp_print_tree (tree->assert_s.child); 1530 fprintf (config.map_file, ", %s)", tree->assert_s.message); 1531 break; 1532 1533 case etree_name: 1534 if (tree->type.node_code == NAME) 1535 fputs (tree->name.name, config.map_file); 1536 else 1537 { 1538 exp_print_token (tree->type.node_code, false); 1539 if (tree->name.name) 1540 fprintf (config.map_file, " (%s)", tree->name.name); 1541 } 1542 break; 1543 default: 1544 FAIL (); 1545 break; 1546 } 1547 } 1548 1549 bfd_vma 1550 exp_get_vma (etree_type *tree, bfd_vma def, char *name) 1551 { 1552 if (tree != NULL) 1553 { 1554 exp_fold_tree_no_dot (tree); 1555 if (expld.result.valid_p) 1556 return expld.result.value; 1557 else if (name != NULL && expld.phase != lang_mark_phase_enum) 1558 einfo (_("%F%P:%pS: nonconstant expression for %s\n"), 1559 tree, name); 1560 } 1561 return def; 1562 } 1563 1564 /* Return the smallest non-negative integer such that two raised to 1565 that power is at least as large as the vma evaluated at TREE, if 1566 TREE is a non-NULL expression that can be resolved. If TREE is 1567 NULL or cannot be resolved, return -1. */ 1568 1569 int 1570 exp_get_power (etree_type *tree, char *name) 1571 { 1572 bfd_vma x = exp_get_vma (tree, -1, name); 1573 bfd_vma p2; 1574 int n; 1575 1576 if (x == (bfd_vma) -1) 1577 return -1; 1578 1579 for (n = 0, p2 = 1; p2 < x; ++n, p2 <<= 1) 1580 if (p2 == 0) 1581 break; 1582 1583 return n; 1584 } 1585 1586 fill_type * 1587 exp_get_fill (etree_type *tree, fill_type *def, char *name) 1588 { 1589 fill_type *fill; 1590 size_t len; 1591 unsigned int val; 1592 1593 if (tree == NULL) 1594 return def; 1595 1596 exp_fold_tree_no_dot (tree); 1597 if (!expld.result.valid_p) 1598 { 1599 if (name != NULL && expld.phase != lang_mark_phase_enum) 1600 einfo (_("%F%P:%pS: nonconstant expression for %s\n"), 1601 tree, name); 1602 return def; 1603 } 1604 1605 if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0) 1606 { 1607 unsigned char *dst; 1608 unsigned char *s; 1609 fill = (fill_type *) xmalloc ((len + 1) / 2 + sizeof (*fill) - 1); 1610 fill->size = (len + 1) / 2; 1611 dst = fill->data; 1612 s = (unsigned char *) expld.result.str; 1613 val = 0; 1614 do 1615 { 1616 unsigned int digit; 1617 1618 digit = *s++ - '0'; 1619 if (digit > 9) 1620 digit = (digit - 'A' + '0' + 10) & 0xf; 1621 val <<= 4; 1622 val += digit; 1623 --len; 1624 if ((len & 1) == 0) 1625 { 1626 *dst++ = val; 1627 val = 0; 1628 } 1629 } 1630 while (len != 0); 1631 } 1632 else 1633 { 1634 fill = (fill_type *) xmalloc (4 + sizeof (*fill) - 1); 1635 val = expld.result.value; 1636 fill->data[0] = (val >> 24) & 0xff; 1637 fill->data[1] = (val >> 16) & 0xff; 1638 fill->data[2] = (val >> 8) & 0xff; 1639 fill->data[3] = (val >> 0) & 0xff; 1640 fill->size = 4; 1641 } 1642 return fill; 1643 } 1644 1645 bfd_vma 1646 exp_get_abs_int (etree_type *tree, int def, char *name) 1647 { 1648 if (tree != NULL) 1649 { 1650 exp_fold_tree_no_dot (tree); 1651 1652 if (expld.result.valid_p) 1653 { 1654 if (expld.result.section != NULL) 1655 expld.result.value += expld.result.section->vma; 1656 return expld.result.value; 1657 } 1658 else if (name != NULL && expld.phase != lang_mark_phase_enum) 1659 { 1660 einfo (_("%F%P:%pS: nonconstant expression for %s\n"), 1661 tree, name); 1662 } 1663 } 1664 return def; 1665 } 1666 1667 static bfd_vma 1668 align_n (bfd_vma value, bfd_vma align) 1669 { 1670 if (align <= 1) 1671 return value; 1672 1673 value = (value + align - 1) / align; 1674 return value * align; 1675 } 1676 1677 void 1678 ldexp_init (void) 1679 { 1680 /* The value "13" is ad-hoc, somewhat related to the expected number of 1681 assignments in a linker script. */ 1682 if (!bfd_hash_table_init_n (&definedness_table, 1683 definedness_newfunc, 1684 sizeof (struct definedness_hash_entry), 1685 13)) 1686 einfo (_("%F%P: can not create hash table: %E\n")); 1687 } 1688 1689 /* Convert absolute symbols defined by a script from "dot" (also 1690 SEGMENT_START or ORIGIN) outside of an output section statement, 1691 to section relative. */ 1692 1693 static bool 1694 set_sym_sections (struct bfd_hash_entry *bh, void *inf ATTRIBUTE_UNUSED) 1695 { 1696 struct definedness_hash_entry *def = (struct definedness_hash_entry *) bh; 1697 if (def->final_sec != bfd_abs_section_ptr) 1698 { 1699 struct bfd_link_hash_entry *h; 1700 h = bfd_link_hash_lookup (link_info.hash, bh->string, 1701 false, false, true); 1702 if (h != NULL 1703 && h->type == bfd_link_hash_defined 1704 && h->u.def.section == bfd_abs_section_ptr) 1705 { 1706 h->u.def.value -= def->final_sec->vma; 1707 h->u.def.section = def->final_sec; 1708 } 1709 } 1710 return true; 1711 } 1712 1713 void 1714 ldexp_finalize_syms (void) 1715 { 1716 bfd_hash_traverse (&definedness_table, set_sym_sections, NULL); 1717 } 1718 1719 /* Determine whether a symbol is going to remain absolute even after 1720 ldexp_finalize_syms() has run. */ 1721 1722 bool 1723 ldexp_is_final_sym_absolute (const struct bfd_link_hash_entry *h) 1724 { 1725 if (h->type == bfd_link_hash_defined 1726 && h->u.def.section == bfd_abs_section_ptr) 1727 { 1728 const struct definedness_hash_entry *def; 1729 1730 if (!h->ldscript_def) 1731 return true; 1732 1733 def = symbol_defined (h->root.string); 1734 if (def != NULL) 1735 return def->final_sec == bfd_abs_section_ptr; 1736 } 1737 1738 return false; 1739 } 1740 1741 void 1742 ldexp_finish (void) 1743 { 1744 bfd_hash_table_free (&definedness_table); 1745 } 1746