[all-commits] [llvm/llvm-project] fc0aa8: [ELF] Check COMMON symbols for PROVIDE and don't r...

Fangrui Song via All-commits all-commits at lists.llvm.org
Wed Feb 23 10:15:57 PST 2022


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: fc0aa8424ca98da29a9c7aa15b4427d47504ba87
      https://github.com/llvm/llvm-project/commit/fc0aa8424ca98da29a9c7aa15b4427d47504ba87
  Author: Fangrui Song <i at maskray.me>
  Date:   2022-02-23 (Wed, 23 Feb 2022)

  Changed paths:
    M lld/ELF/LinkerScript.cpp
    M lld/ELF/Writer.cpp
    M lld/test/ELF/edata-etext.s

  Log Message:
  -----------
  [ELF] Check COMMON symbols for PROVIDE and don't redefine COMMON symbols edata/end/etext

In GNU ld, the definition precedence is: regular symbol assignment > relocatable object definition > `PROVIDE` symbol assignment.

GNU ld's internal linker scripts define the non-reserved (by C and C++)
edata/end/etext with `PROVIDE` so the relocatable object definition takes
precedence. This makes sense because `int end;` is valid.

We currently redefine such symbols if they are COMMON, but not if they are
regular definitions, so `int end;` with -fcommon is essentially a UB in ld.lld.
Fix this (also improve consistency and match GNU ld) by using the
`isDefined` code path for `isCommon`. In GNU ld, reserved identifiers like
`__ehdr_start` do not use `PROVIDE`, while we treat them all as `PROVIDE`, this
seems fine.

Reviewed By: peter.smith

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




More information about the All-commits mailing list