<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/106223>106223</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Should `PROVIDE` provide symbols that are only referenced by garbage-collected symbols?
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          partaror
      </td>
    </tr>
</table>

<pre>
    `PROVIDE` linker script directive provide symbols that are referenced by the link but are not defined anywhere. But what should be the `PROVIDE` behavior for symbols that are only referenced by symbols which are garbage-collected? Please consider this concrete example:

```bash
#!/usr/bin/env bash

cat >1.c <<\EOF
extern int foo;

int bar() { return foo; }
int baz() { return 1; }

int main() { return baz(); }
EOF

cat >script.t <<\EOF
PROVIDE(foo = 3);
EOF

clang-14 -o 1.o 1.c -c -ffunction-sections
ld.lld -o 1.out 1.o -T script.t -e main --gc-sections --print-gc-sections 
# Output:
# removing unused section 1.o:(.text)
# removing unused section 1.o:(.text.bar)

llvm-readelf -s 1.out
# Output: 
# Symbol table '.symtab' contains 5 entries:
# Num:    Value          Size Type    Bind   Vis       Ndx Name
#     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT   UND
#     1: 0000000000000000     0 FILE    LOCAL  DEFAULT   ABS 1.c
#     2: 0000000000000003     0 NOTYPE  GLOBAL DEFAULT   ABS foo
#     3: 0000000000201180    11 FUNC    GLOBAL DEFAULT     2 baz
#     4: 0000000000201190    26 FUNC    GLOBAL DEFAULT     2 main
```

In the above example, `foo` is inserted into the link by `PROVIDE(foo = 3)` because it is referenced by `bar`. However, `bar` is itself not used anywhere and is garbage-collected during the link. So, from one perspective `foo` is not used anywhere. Is it right to provide a symbol from `PROVIDE` if the symbol is not used anywhere?

I am looking forward to more thoughts and opinions on this.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVlFvozgQ_jXOywgEJgnJAw9NU-4qVe3q2l3pHg0egm-NjWyTNvvrT3ZoGpLcSocIEPubb2aw5xuYtWKnEAuy2JDFdsYG12pT9Mw4ZrSZVZofCrJMvv318uNx-0CWCUihfqIBWxvRO-DCYO3EHqE3ei84gj10lZYWXMscMINgsEGDqkYO1QFci4ECquE4rbQDjo1QyIGpw3uLBmPYDA7ePYNt9SA5VBgsp6FU2LK90AYaba79aiUPF84_Me-tqNsA2jFTsR1GtZYSa4ecZCV8k8gsQq2VFRwNuFZY_6826BDwg3W9RJLdkWRLks_rMjmeFbPtOEQzQlNCy8EaQstKKEJLVHs4g4RrzRyQ7CGNayDZvT8X9w8v5XESPxwaBUI5aLQm2ebc0o9WzBC6InQNJN-AQTcYNUKB5Ntz4K9rYDqBfYE75sO9RJ8oJlanWCfpHHdI7G7k9LmGdNVoDSTbQnbkvM0nmdpF6RwiDWnsfzVENURNM6jaCa0ii-Fuj3jJYyn5iB5csIne4BRPhCE7iKJdfTKFKOqNUG4ydlpHeBlcP7ivNacZGOz0XqgdDGqwyGG08u48jq5ihx_O5_U_TeKwouvzVyDlvosMMo6ygcgeE7sR3VnEr2Gvg2OVRCA0j-2hc6wiNPdb2TGhLCwAlTMC7SSx56HzVADwg8kB4XS8il8Ib4c-DG2E4h4i7Dj7zD_gmXX4ReSPxFMlF8dxBp5f3v7-9gDw9HJ_9wSwfSjvvj-9AcD35-2UJf0NS_n49OCfrljuNq9-r0yZ6A2m7CKeP55eNndPF0y-oiZM2ZSJJmm6CjGlKZTfn-_94xUTAA1FNGGaXzOtAxNd_p4pFOlUfs53zaMKoskqvf-SLXrvVdRns0xAWBDKonHIvcLoM3k-nIvtRaEG7a3ZYBGE8yRTmQ0qaMgyieFP_Y57NKPX42jw6qzfyl78QyV8Kj8wxf38lS4DH4yvnM8AY3jVnrUxugOtEHo0th970STBKx8xPPoAwIhd68DpU-tiY4M4kk57jWiC6xFwi5ZkE9V6BNaB1Pqnj7rR5p0Z7p112vhepodd62xIV_dCBbnRKrSaeMaLjK-zNZthkeZ0ni8Xq-Vq1hZNkzcrumjyPFvnDV_UFaWUVwvG8nWaLtczUdCEzpMVzdMsy-ermNJlulozZHVVUcYzMk-wY0LGXlFibXYzYe2ARZosKc1mklUobfgaoFThO4RZQqn_ODBFkKFq2FkyT6Swzn7ROOEkFq_Hbj19df_5ZXCjQ1-v-2hFsnI2GFm0zvVBrmhJaLkTrh2quNYdoaWPZbxFvdH_YO0ILUMGltByTHFf0H8DAAD__7ADqcA">