llvm-project/lld/ELF
Fangrui Song debcac9fef [ELF] Make LinkerScript::assignAddresses iterative
PR42990. For `SECTIONS { b = a; . = 0xff00 + (a >> 8); a = .; }`,
we currently set st_value(a)=0xff00 while st_value(b)=0xffff.

The following call tree demonstrates the problem:

```
link<ELF64LE>(Args);
  Script->declareSymbols(); // insert a and b as absolute Defined
  Writer<ELFT>().run();
    Script->processSectionCommands();
      addSymbol(cmd);       // a and b are re-inserted. LinkerScript::getSymbolValue
                            // is lazily called by subsequent evaluation
    finalizeSections();
      forEachRelSec(scanRelocations<ELFT>);
        processRelocAux     // another problem PR42506, not affected by this patch
      finalizeAddressDependentContent(); // loop executed once
        script->assignAddresses(); // a = 0, b = 0xff00
    script->assignAddresses(); // a = 0xff00, _end = 0xffff
```

We need another assignAddresses() to finalize the value of `a`.

This patch

1) modifies assignAddress() to track the original section/value of each
  symbol and return a symbol whose section/value has changed.
2) moves the post-finalizeSections assignAddress() inside the loop
  of finalizeAddressDependentContent() and makes it iterative.
  Symbol assignment may not converge so we make a few attempts before
  bailing out.

Note, assignAddresses() must be called at least twice. The penultimate
call finalized section addresses while the last finalized symbol values.
It is somewhat obscure and there was no comment.
linkerscript/addr-zero.test tests this.

Reviewed By: ruiu

Differential Revision: https://reviews.llvm.org/D66279

llvm-svn: 369889
2019-08-26 10:23:31 +00:00
..
Arch [ELF][Hexagon] Improve error message for unknown relocations 2019-08-19 14:07:14 +00:00
AArch64ErrataFix.cpp [ELF] Fix variable names in comments after VariableName -> variableName change 2019-07-16 05:50:45 +00:00
AArch64ErrataFix.h [ELF] Fix variable names in comments after VariableName -> variableName change 2019-07-16 05:50:45 +00:00
CMakeLists.txt Fail early if an output file is not writable 2019-03-11 16:30:55 +00:00
CallGraphSort.cpp Rename F_{None,Text,Append} to OF_{None,Text,Append}. NFC 2019-08-05 05:43:48 +00:00
CallGraphSort.h Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
Config.h [ELF] Consistently prioritize non-* wildcards overs "*" in version scripts 2019-08-05 14:31:39 +00:00
DWARF.cpp gdb-index: Wire up str_offsets section to avoid incorrect error message about offsets_base 2019-08-07 22:49:14 +00:00
DWARF.h gdb-index: Wire up str_offsets section to avoid incorrect error message about offsets_base 2019-08-07 22:49:14 +00:00
Driver.cpp [ELF] Error if --strip-all and --emit-relocs are used together 2019-08-26 06:23:53 +00:00
Driver.h [Coding style change] Rename variables so that they start with a lowercase letter 2019-07-10 05:00:37 +00:00
DriverUtils.cpp Re-submit r367649: Improve raw_ostream so that you can "write" colors using operator<< 2019-08-07 08:08:17 +00:00
EhFrame.cpp [Coding style change] Rename variables so that they start with a lowercase letter 2019-07-10 05:00:37 +00:00
EhFrame.h [Coding style change] Rename variables so that they start with a lowercase letter 2019-07-10 05:00:37 +00:00
ICF.cpp [Coding style change][lld] Rename variables for non-ELF ports 2019-07-11 05:40:30 +00:00
ICF.h Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
InputFiles.cpp [LLD] Migrate llvm::make_unique to std::make_unique 2019-08-14 22:28:17 +00:00
InputFiles.h [ELF] Fix variable names in comments after VariableName -> variableName change 2019-07-16 05:50:45 +00:00
InputSection.cpp [ELF][PPC] Allow PT_LOAD to have overlapping p_offset ranges 2019-08-20 08:34:25 +00:00
InputSection.h [ELF] Fix variable names in comments after VariableName -> variableName change 2019-07-16 05:50:45 +00:00
LTO.cpp [LLD] Migrate llvm::make_unique to std::make_unique 2019-08-14 22:28:17 +00:00
LTO.h [Coding style change] Rename variables so that they start with a lowercase letter 2019-07-10 05:00:37 +00:00
LinkerScript.cpp [ELF] Make LinkerScript::assignAddresses iterative 2019-08-26 10:23:31 +00:00
LinkerScript.h [ELF] Make LinkerScript::assignAddresses iterative 2019-08-26 10:23:31 +00:00
MapFile.cpp Fight a bit against global initializers. NFC. 2019-08-22 19:43:27 +00:00
MapFile.h Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
MarkLive.cpp ELF: Move sections referred to by __start_/__stop_ symbols into the main partition. 2019-08-09 00:57:54 +00:00
MarkLive.h Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
Options.td [ELF] Mention contents of reproduce archive and add help description. 2019-08-23 14:41:25 +00:00
OutputSections.cpp [Coding style change] Rename variables so that they start with a lowercase letter 2019-07-10 05:00:37 +00:00
OutputSections.h [Coding style change] Rename variables so that they start with a lowercase letter 2019-07-10 05:00:37 +00:00
README.md
Relocations.cpp [ELF] Make LinkerScript::assignAddresses iterative 2019-08-26 10:23:31 +00:00
Relocations.h [ELF][Hexagon] Replace R_HEXAGON_GOT with R_GOTPLT 2019-08-16 17:01:56 +00:00
ScriptLexer.cpp [Coding style change] Rename variables so that they start with a lowercase letter 2019-07-10 05:00:37 +00:00
ScriptLexer.h [Coding style change] Rename variables so that they start with a lowercase letter 2019-07-10 05:00:37 +00:00
ScriptParser.cpp [ELF] Consistently prioritize non-* wildcards overs "*" in version scripts 2019-08-05 14:31:39 +00:00
ScriptParser.h [ELF] Fix variable names in comments after VariableName -> variableName change 2019-07-16 05:50:45 +00:00
SymbolTable.cpp [ELF] Initialize 2 fields of Symbol in SymbolTable::insert 2019-08-14 01:52:47 +00:00
SymbolTable.h [ELF] Rename odd variable names "New" after r365730. NFC 2019-08-13 06:19:39 +00:00
Symbols.cpp [ELF] Simplify handling of exportDynamic and isPreemptible 2019-08-13 09:12:52 +00:00
Symbols.h [ELF] Initialize 2 fields of Symbol in SymbolTable::insert 2019-08-14 01:52:47 +00:00
SyntheticSections.cpp Reland D65242 "[ELF] More dynamic relocation packing"" 2019-08-21 09:21:37 +00:00
SyntheticSections.h [ELF] Fix variable names in comments after VariableName -> variableName change 2019-07-16 05:50:45 +00:00
Target.cpp [Coding style change] Rename variables so that they start with a lowercase letter 2019-07-10 05:00:37 +00:00
Target.h [ELF] Fix variable names in comments after VariableName -> variableName change 2019-07-16 05:50:45 +00:00
Thunks.cpp [ELF] Fix variable names in comments after VariableName -> variableName change 2019-07-16 05:50:45 +00:00
Thunks.h [Coding style change] Rename variables so that they start with a lowercase letter 2019-07-10 05:00:37 +00:00
Writer.cpp [ELF] Make LinkerScript::assignAddresses iterative 2019-08-26 10:23:31 +00:00
Writer.h [Coding style change] Rename variables so that they start with a lowercase letter 2019-07-10 05:00:37 +00:00

README.md

See docs/NewLLD.rst