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

    <tr>
        <th>Summary</th>
        <td>
            [wasm-ld] --gc-sections shouldn't strip data segments in input objects referenced by start/stop symbols
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    wasm-ld mis-strips live data segments referenced by start/stop symbols.

The linker should keep data segments if any symbol in an object file, which contains the data segment, is referenced and start/stop symbols for the segment are referenced.

For the following case, it works with ELF lld, but doesn't with wasm-ld due to the mis-stripping.

```c
// in foo.c, which is archived as libfoo.a
__attribute__((__section__("foo_md")))
char FOO_MD[] = "bar";

void foo_func(void) {}

// in main.c, which links foo via -lfoo

#include <stdio.h>

extern const char __start_foo_md;
extern const char __stop_foo_md;

extern void foo_func(void);

int main(void) {
    printf("__start_foo_md = %p, __stop_foo_md = %p\n", &__start_foo_md, & __stop_foo_md);
    foo_func();
    return 0;
}
```

```console
$ clang -target wasm32-unknown-unknown -c foo.c && llvm-ar cr libfoo.a foo.o
$ clang -target wasm32-unknown-unknown main.c -lfoo -L. -fuse-ld=lld
wasm-ld: error: /tmp/main-c796ab.o: undefined symbol: __start_foo_md
wasm-ld: error: /tmp/main-c796ab.o: undefined symbol: __stop_foo_md
```

Discussion with @sbc100: https://github.com/WebAssembly/wasi-libc/pull/296
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytVcuOozoQ_RqyKRERCHksWHR3JqsZzWakWSJjCvDE2Mg2nZu_v2UgnYB6ru5IEzkBU-XinFOPFLq8ZVdm21CW0AobWmdEZ0GKd4SSOQYW6xaVs2CwQoOKYwnFDaxjxgXx2Trdgb21hZZ2HUSnIHoZf380SFHUBQ3YRvcU_oLYLWKKCpi6TedBKNqBLn4hd1AJiUH8BtdG8Aa4Vo4JZcE1c1zeRczAMVV-ig4qbYbj00lgBp_OzcCfJ9dKS6mvQtXAmR3gCAdXbS4WrsI18OXrGaQsvaHoHZQarQrivRutd13LHsHpIeCHxB0Fnb0y2EXj4tM-PtPymlRar_lDCmLLDG8oQcTVZ6rwDmw8lefMUXgCg3kexAdaeW5JT6HV9CAm97wlzHEQH6c1nOUNM3D-_j3_dgrS1yA9QZDQN44LZrx38vqM912L0kPLq14RuoPfUygI9q_B_jRj9sGkpRQ-U_H14fOi4V0wCCXdzQ8mQnHZl0hI3qwrhV43QfLl2Qf_cWiUrw_rYGBAfH3284nmHfXnjrpb-s28f0Ny4SyomDy1hQqDDejTGfKoRvHn6CaF085rMsPzsKRvasjVG213C3LjwwWTJ3z-7U_wlyaDrieW0YPPR-bu1fh5iZKImtpzytIWuGTUIyFBq9ENdZ_EYa8uSl_V_QohH0vZQ_aopXxvQ8oDNx9FPDjoP4w7VtVYPhB-XUNY9Rap8UhC35xDtKkXg-QF0Bht_A1VpWtJ-rOPEPL9cccKejtZelViJRR12Dg8_LOF9H8x6iN1v9f-JCzvraU2HmdLsI1swTdR5IM0znWWbsZOq8neF2uuW9r8xOLFWmwLeaMd4RUhiU3FcO56KekSH3erMkvKY3JkKyecxIy6_06MhkAY1jycRoidZvk45IZBtpzoilZHs3Ac4__nb2PVG5n9BwVfJ9Ml7Iz2YWkrrO3R0k2aHpLjqsk2myrdpSkeDvt0uz0UZXIsd3y_SXfskEYHXElWoLTZONtWIoujOI52UbzZJ9vtZr2topJF-3iDabxnx4QURkqhXPsXr7WpVyYbMBR9bckohXX2YWSUnFoh3uOz3jXaZBfmUCgtanbpL71aDbCzAfO_G9VdUw">