diff --git a/Makefile b/Makefile index 2a26e1eca..886fcea04 100644 --- a/Makefile +++ b/Makefile @@ -188,13 +188,13 @@ $(ARCH_DIR): protobuf config $(Q) $(MAKE) $(build)=$(ARCH_DIR) all ifneq ($(filter i386 ia32 x86_64, $(ARCH)),) -pie/piegen/%: +pie/piegen/%: config $(Q) $(MAKE) $(build)=pie/piegen $@ -pie/piegen: +pie/piegen: config $(Q) $(MAKE) $(build)=pie/piegen all $(PIEGEN): pie/piegen/built-in.o $(E) " LINK " $@ - $(Q) $(CC) $(CFLAGS) $^ $(LDFLAGS) -o $@ + $(Q) $(CC) $(CFLAGS) pie/piegen/built-in.o $(LDFLAGS) -o $@ .PHONY: pie/piegen endif diff --git a/pie/Makefile b/pie/Makefile index 424bf34f2..17027b82f 100644 --- a/pie/Makefile +++ b/pie/Makefile @@ -49,6 +49,34 @@ PIELDS := pie.lds.S .SECONDARY: +ifneq ($(filter i386 ia32 x86_64, $(ARCH)),) +ldflags-y += -r +target-name = $(patsubst pie/%-blob.h,%,$(1)) + +ifeq ($(ARCH),x86_64) +$(obj)/$(PIELDS): $(obj)/pie-reloc.lds.S.in + $(E) " GEN " $@ + $(Q) echo "OUTPUT_ARCH(i386:x86-64)" > $(obj)/$(PIELDS) + $(Q) echo "TARGET(elf64-x86-64)" >> $(obj)/$(PIELDS) + $(Q) cat $< >> $(obj)/$(PIELDS) +else +$(obj)/$(PIELDS): $(obj)/pie-reloc.lds.S.in + $(E) " GEN " $@ + $(Q) echo "OUTPUT_ARCH(i386)" > $(obj)/$(PIELDS) + $(Q) echo "TARGET(elf32-i386)" >> $(obj)/$(PIELDS) + $(Q) cat $< >> $(obj)/$(PIELDS) +endif + +$(obj)/%.built-in.bin.o: $(obj)/%.built-in.o $(obj)/$(PIELDS) + $(E) " GEN " $@ + $(Q) $(LD) $(ldflags-y) -T $(obj)/$(PIELDS) -o $@ $< + +$(obj)/%-blob.h: $(obj)/%.built-in.bin.o $(obj)/$(PIELDS) pie/piegen + $(E) " GEN " $@ + $(Q) pie/piegen/piegen -f $< -p $(call target-name,$@)_blob_offset__ -s $(call target-name,$@)_blob > $@ + +else + $(obj)/$(PIELDS): $(obj)/$(PIELDS).in $(E) " GEN " $@ $(Q) $(SH) -c "echo 'OUTPUT_ARCH($(LDARCH))' > $(obj)/$(PIELDS)" @@ -66,6 +94,8 @@ $(obj)/%-blob.h: $(obj)/%.built-in.bin $(obj)/$(GEN-OFFSETS) $(E) " GEN " $@ $(Q) $(SH) $(obj)/$(GEN-OFFSETS) $(@:-blob.h=) $(notdir $(@:-blob.h=)) $(CROSS_COMPILE) > $@ +endif + $(BLOBS): $(obj)/$(PIELDS) _all += $(BLOBS) diff --git a/pie/pie-reloc.lds.S.in b/pie/pie-reloc.lds.S.in new file mode 100644 index 000000000..672a6af90 --- /dev/null +++ b/pie/pie-reloc.lds.S.in @@ -0,0 +1,27 @@ +SECTIONS +{ + .text : { + *(.head.text) + *(.text*) + } + + .data : { + *(.data*) + *(.bss*) + } + + .rodata : { + *(.rodata*) + *(.got*) + *(.toc*) + } + + /DISCARD/ : { + *(.debug*) + *(.comment*) + *(.note*) + *(.group*) + *(.eh_frame*) + } +__export_parasite_args = .; +}