Skip to content
Snippets Groups Projects
Forked from redox-os / relibc
Loading
  • 8tab's avatar
    a7480ea6
    Fix global symbols relocations · a7480ea6
    8tab authored
    Instead of a single source of symbols, now linker keeps a list of DSO (former Library) objects
    with their own symbols map. That helps to process R_X86_64_COPY relocations correctly.
    For example, if 'a.out' executable with dependencies ['libstdc++.so', 'libc.so'] is being loaded
    and 'a.out' uses 'stdout' symbol from 'libc.so', its relocation process goes as follows:
    - linker processes relocation entry 'stdout' of type R_X86_64_GLOB_DAT from 'libc.so',
    - it goes through object list ['a.out', 'libstdc++.so', 'libc.so'] to find first object
      that exports 'stdout' symbol. The symbol is in 'a.out' with the value e.g. '0x404070',
    - linker sets 'stdout' symbol GOT entry in 'libc.so' to '0x404070',
    ....
    - linker processes relocation entry 'stdout' of type R_X86_64_COPY from 'a.out',
    - it goes through object list excluding 'a.out': ['libstdc++.so', 'libc.so']. The symbol is found in 'libc.so',
    - linker copies the 'stdout' symbol content from 'libc.so' to memory at address '0x404070' (in 'a.out' object).
    
    Objects are relocated in reverse order they were loaded. So in the example above, linker starts with relocating
    'libc.so' and ends with 'a.out'. It is necessary e.g. when linking with 'libstdc++.so' - there are many
    relocations which symbols are found in 'libstdc++.so', so they need to be resolved before their contents are
    copied to 'a.out'. That also matches GNU ld.so behavior.
    a7480ea6
    History
    Fix global symbols relocations
    8tab authored
    Instead of a single source of symbols, now linker keeps a list of DSO (former Library) objects
    with their own symbols map. That helps to process R_X86_64_COPY relocations correctly.
    For example, if 'a.out' executable with dependencies ['libstdc++.so', 'libc.so'] is being loaded
    and 'a.out' uses 'stdout' symbol from 'libc.so', its relocation process goes as follows:
    - linker processes relocation entry 'stdout' of type R_X86_64_GLOB_DAT from 'libc.so',
    - it goes through object list ['a.out', 'libstdc++.so', 'libc.so'] to find first object
      that exports 'stdout' symbol. The symbol is in 'a.out' with the value e.g. '0x404070',
    - linker sets 'stdout' symbol GOT entry in 'libc.so' to '0x404070',
    ....
    - linker processes relocation entry 'stdout' of type R_X86_64_COPY from 'a.out',
    - it goes through object list excluding 'a.out': ['libstdc++.so', 'libc.so']. The symbol is found in 'libc.so',
    - linker copies the 'stdout' symbol content from 'libc.so' to memory at address '0x404070' (in 'a.out' object).
    
    Objects are relocated in reverse order they were loaded. So in the example above, linker starts with relocating
    'libc.so' and ends with 'a.out'. It is necessary e.g. when linking with 'libstdc++.so' - there are many
    relocations which symbols are found in 'libstdc++.so', so they need to be resolved before their contents are
    copied to 'a.out'. That also matches GNU ld.so behavior.