<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/94427>94427</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
lld: Orphaned .got input section gets added to .dynamic output section
</td>
</tr>
<tr>
<th>Labels</th>
<td>
lld
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
mintsuki
</td>
</tr>
</table>
<pre>
Reproducer:
```sh
cat > GNUmakefile <<'eof'
override MAKEFLAGS += -rR
override KERNEL := kernel
define DEFAULT_VAR =
ifeq ($(origin $1),default)
override $(1) := $(2)
endif
ifeq ($(origin $1),undefined)
override $(1) := $(2)
endif
endef
override DEFAULT_KCC := cc
$(eval $(call DEFAULT_VAR,KCC,$(DEFAULT_KCC)))
override DEFAULT_KLD := ld
$(eval $(call DEFAULT_VAR,KLD,$(DEFAULT_KLD)))
override DEFAULT_KCFLAGS := -g -O2 -pipe
$(eval $(call DEFAULT_VAR,KCFLAGS,$(DEFAULT_KCFLAGS)))
override DEFAULT_KCPPFLAGS :=
$(eval $(call DEFAULT_VAR,KCPPFLAGS,$(DEFAULT_KCPPFLAGS)))
override DEFAULT_KLDFLAGS :=
$(eval $(call DEFAULT_VAR,KLDFLAGS,$(DEFAULT_KLDFLAGS)))
override KCFLAGS += \
-Wall \
-Wextra \
-std=gnu11 \
-ffreestanding \
-fno-stack-protector \
-fno-stack-check \
-fno-lto \
-fPIE \
-m64 \
-march=x86-64 \
-mno-80387 \
-mno-mmx \
-mno-sse \
-mno-sse2 \
-mno-red-zone
override KCPPFLAGS := \
-I src \
$(KCPPFLAGS) \
-MMD \
-MP
override KLDFLAGS += \
-m elf_x86_64 \
-nostdlib \
-pie \
-z text \
-z max-page-size=0x1000 \
-T linker.ld
override CFILES := $(shell cd src && find -L * -type f -name '*.c')
override ASFILES := $(shell cd src && find -L * -type f -name '*.S')
override OBJ := $(addprefix obj/,$(CFILES:.c=.c.o) $(ASFILES:.S=.S.o))
override HEADER_DEPS := $(addprefix obj/,$(CFILES:.c=.c.d) $(ASFILES:.S=.S.d))
# Default target.
.PHONY: all
all: bin/$(KERNEL)
bin/$(KERNEL): GNUmakefile linker.ld $(OBJ)
mkdir -p "$$(dirname $@)"
$(KLD) $(OBJ) $(KLDFLAGS) -o $@
-include $(HEADER_DEPS)
obj/%.c.o: src/%.c GNUmakefile
mkdir -p "$$(dirname $@)"
$(KCC) $(KCFLAGS) $(KCPPFLAGS) -c $< -o $@
obj/%.S.o: src/%.S GNUmakefile
mkdir -p "$$(dirname $@)"
$(KCC) $(KCFLAGS) $(KCPPFLAGS) -c $< -o $@
.PHONY: clean
clean:
rm -rf bin obj
eof
cat > linker.ld <<'eof'
OUTPUT_FORMAT(elf64-x86-64)
OUTPUT_ARCH(i386:x86-64)
ENTRY(_start)
PHDRS
{
text PT_LOAD FLAGS(0x05); /* Execute + Read */
rodata PT_LOAD FLAGS(0x04); /* Read only */
data PT_LOAD FLAGS(0x06); /* Write + Read */
dynamic PT_DYNAMIC FLAGS(0x06); /* Dynamic PHDR for relocations */
}
SECTIONS
{
. = 0xffffffff80000000;
.text : {
*(.text .text.*)
} :text
. = ALIGN(CONSTANT(MAXPAGESIZE));
.rodata : {
*(.rodata .rodata.*)
} :rodata
. = ALIGN(CONSTANT(MAXPAGESIZE));
a_symbol = .;
.data : {
*(.data .data.*)
} :data
.dynamic : {
*(.dynamic)
} :data :dynamic
.bss : {
*(.bss .bss.*)
*(COMMON)
} :data
/DISCARD/ : {
*(.eh_frame*)
*(.note .note.*)
*(.interp)
}
}
eof
mkdir -p ./src
cat > src/main.c <<'eof'
#include <stdint.h>
#include <stddef.h>
static void hcf(void) {
asm ("cli");
for (;;) {
asm ("hlt");
}
}
void _start(void) {
hcf();
}
extern char a_symbol[];
uint64_t some_func(void) {
return (uint64_t)a_symbol + 0x1234;
}
eof
```
Build with `make clean all KLD=ld.lld KCC=clang`.
Relevant part of `llvm-readelf -a`:
```
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x001000 0xffffffff80000000 0xffffffff80000000 0x000090 0x000090 R E 0x1000
LOAD 0x002000 0xffffffff80001000 0xffffffff80001000 0x0000d8 0x0000d8 RW 0x1000
DYNAMIC 0x002000 0xffffffff80001000 0xffffffff80001000 0x0000d8 0x0000d8 RW 0x8
Section to Segment mapping:
Segment Sections...
00 .text .dynsym .gnu.hash .hash .dynstr .rela.dyn
01 .dynamic .got
02 .dynamic .got
```
This seems incorrect. It also causes the following `llvm-readelf` warning:
```
llvm-readelf: warning: 'bin/kernel': invalid PT_DYNAMIC size (0xd8)
llvm-readelf: warning: 'bin/kernel': PT_DYNAMIC dynamic table is invalid: SHT_DYNAMIC will be used
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMWF1z4rjS_jXKTZddRubzgguDYZKdJFDA7Lzz3lDCkkEb2eZIIkPm15-SbIxtnFRmdy-Oi7JNd-vpR1KrWzJRiu9TxsaoN0G98I6c9CGT44SnWp1e-N0uo2_jFTvKjJ4iJpEfIC9EXoD6Xv5Th1wQEQ3In8GX528JeWExFwyQPzU_PGBZjPAgN8xemZScMngKvs7mj8GXNSA8QX4IjlwV4HXDr7PV8-wRjG8_hBcmUyaqhpTFPGUQzubBt8fN9s9gBcgPcx0AAI_ZfwDhIcJdhIeZ5HueAsLdDsIjhKeUxeQktPmTNykd5w2M2cV5LsFXWwBgKeXxp72d0pwurWGY63fcVnwyA9g6bpcB-TqdXoCiqLC0gOyViAI7IkJURxDh6dfpFOFprq5A2W6MSirv-XwMLz4F_Q2fj-GtTyP7lM9pEU65X2cPzgKDc-RH9ju9tiAtPS_kn2OyXFa5_I77omULgVLzyQn4mwyKhm3z8An_5STkaxr1pkXIOt-Nr-t_AHC-s7OWpCFUmiI_3KenTqehiWPJmNIkpTzdN3Vp5ihNohfnKDPNIp3Jdy2iA4teWrRCZ03p8mHWECX9blNCZHRAfnge9p1bZZo5Q88fDlrkSXJukSrF2qW4OppGJhl1fmUpe2ci6jHYwHwAJaOKLJ_rapA1Gjw9NSGelu2Oy8i7CYEEmIi352F_ezNOaaY0FXzXEB95czB-gWZnXUX9BQk5O0eyZ47ivxjyQ-_c8Tyv0XADgqcvTLplQqrzns4fHmfrespVByYERDQfLNxHuA8xTyk4j4BwAI5-OzKIwUlJYhL3AOHAjexz1IAP1v8W_roVfzH5o45NKD1KFvMzZLu_EJ6XCzrvKPINUz90Izezs211BUujXBvl2ipvvd3PgnC22oaz5frveqUfeaW3KQZhH8K8VoMmcs-0myvc5f3i-QfyAyCi2BiYFz-AHU8tBRvadhfRwGw38IPaNqYMm4LtYvJHBWaUvFAuwTkCwtgaGBvKZTFlXdT1bGdw2aLwZ-taDRNKTbkIneyCUaHt8DQSp3KrUJmMZlou5qBnZ9kPTJxdBNU-_vPO2I1BmUWuOeQ2rTiRlfrT9r5dKa-blNf_o5SvARgJRtJiQ2xfy_2yN5IJODI2MWmXRr55y-L69rkSa22b58W3zfLbZjtfrJ6CjSnlIu53nbzwlFNfGAWr6T3CQ-4P-8gPGjb5ffa8Wf1AeLhVmkjdUC7vw9W6EAwmRSK1uddcy832cRGE5rUYpqF39np2-UzATlgAszOLTtrMwgRWjJgFFBhVmZRlRokm74B162AWIEvF2w2KxaiSqoD06yDfJf-ID31LScIjixT-eA6eHqYfgIWFtRkpiDMJkoksIppnqapBo0FYHdn1bLp5WDzfDC4AuOboAt45Lq6hl1_In1QRrGleB_0Aagjmsr6HuYG9u1ZSOXCggd2fG90NrqUQPD58eTZpe_G83gTPJtiegv9bBl9m64f_nxXZuYVUMaN1WgWfQlc83-OUa_9VVmSr3pJdJiyG20a7hXR9LHPmH_FuZX0JqNbxKJTvgdlnYdLE3Sn1IV2jN7cbsleb6eLpafH82Z4gPA8f1tNgFSI8b-8OO2xjSRL2vks3zTQDe_-AmMtTzeTxqr0un8tLmTfL5O8iPDeVopZN89KREJ66UXtCRdgva6k_VZryVLsH5M_eUVMWV9X2rjTRPILXjFM4RDHCQ_NqS0l1dohK8u8COBLc1qprqBq9SSBG70_Mr9m6jnAQuolwO0j53dK6JPh2Zjnp2tKpY7CzZjKF6EBkuZbyD0aNtXTiqe53txpUlrBtfEqj93xKpk8yNd25tEF4dF2neALeuYP97i2lcu7Lb1D538mJCwo_uT4A6ntmm5CXY7MrNIcS5IeCukJQMJXfDyNB0j3qe261Aysm2CtJNRyJ1JDFBkqI18SRjFAmYnCIcXjzGawomTLbS5LAvTGWqjQD2Jh9_PVaxLFippD-yaUOKJWwPLwp-3K95lywNf8F8MQS-4S52EMg-D69wF6qZnF5Z8-zJ5_bAtIuMo9R5WUFM8gPTzUPRo9vQVpcda64dHh9WX1vwF6Ka4X4P3UA3nlYy1prFplSDDqDNdsnLNWQkOORp_vKxFw0hbFyXbcMUs-Da6E12Vq9JeDu05N7IOoAxd3ItQRXMkHMHyjaex2olQB3n2m4YuNbbWtM5ffNgStQjCUKeBplUrJIu_CggQiVQUROiinQBwZxJkT2034fqUcu6nvwk8i02v2Gq5q5H1TMzdEzPysVn1_xwEh5-koEp9XdkjmBg90t0WGZwX8buAJ4GSBNdoIBVxenxmx9f7X7yYWAHYOTYrTRuzs69unIH5E7Nu4MOoNev9PveHeHsRdFfdrr-Z3ertPbRfHIGw58MvC7EWYkwtEdH2MPd72-1_O6uN_z3G4vIqTv-8TzOrgX9VHXYwnhwjVddDO5v-NKndh41O3iwZ0gOyaU_baOsRDU5OxeeCfHdkB2p71CXU9wpdW1veZasLEx9gNYyOOBpIzmwcPT40mDKsJ6z7QCQimjJsLLQMpOumJ1d5JifND6aJOR2bbO91wfTjs3yhKE58Zt8XCOMvuLRRrhue2DQnied-N1jP8bAAD__66AVNk">