[CRIU] [PATCH 2/2] x86: Start using native object relocatable files in parasite code

Cyrill Gorcunov gorcunov at openvz.org
Fri May 8 10:02:08 PDT 2015


Since at the moment we're running only x86-64 not 32 bit tasks,
and our code is not carrying any big statically defined structures
we can use relocatable files directly with all relocation applied
during building.

This gonna be changed soon once we start supporting 32 bit tasks.

IOW even currently we need (which is not yet done but it's safe)

 - check for gotpcrel relocations
 - apply relocations with generated elf_apply_relocs helper

Currently overall scheme looks this way

 - our object files are linked together into parasite.built-in.bin.o file
 - then pie/piegen/piegen tool is called which parses this file and generates
   C source code file with bytestream and all information needed to rellocate
   this bytestream into a new place (see elf_apply_relocs helper)

Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
 Makefile               |  6 +++---
 pie/Makefile           | 33 ++++++++++++++++++++++++++++++++-
 pie/pie-reloc.lds.S.in | 27 +++++++++++++++++++++++++++
 3 files changed, 62 insertions(+), 4 deletions(-)
 create mode 100644 pie/pie-reloc.lds.S.in

diff --git a/Makefile b/Makefile
index 4275bc8ed066..59a579fd2e44 100644
--- a/Makefile
+++ b/Makefile
@@ -186,13 +186,13 @@ $(ARCH_DIR): protobuf config
 	$(Q) $(MAKE) $(build)=$(ARCH_DIR) all
 
 ifneq ($(filter i386 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 11620d7dcee9..3dae145a4431 100644
--- a/pie/Makefile
+++ b/pie/Makefile
@@ -34,7 +34,8 @@ restorer-libs-e		+= $(SYSCALL-LIB)
 #
 CFLAGS			:= $(filter-out -pg,$(CFLAGS))
 
-cflags-y		+= -DCR_NOGLIBC -fpie  -Wa,--noexecstack -fno-stack-protector
+cflags-y		+= -DCR_NOGLIBC -fpie -Wa,--noexecstack -fno-stack-protector
+
 ifeq ($(SRCARCH), arm)
 	cflags-y	+= -marm
 endif
@@ -47,6 +48,34 @@ PIELDS			:= pie.lds.S
 
 .SECONDARY:
 
+ifneq ($(filter x86_64 i386, $(ARCH)),)
+ldflags-y += -r
+target-name = $(patsubst pie/%-blob.h,%,$(1))
+
+ifeq ($(ARCH),i386)
+$(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)
+else
+$(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)
+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)"
@@ -64,6 +93,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 000000000000..672a6af90a41
--- /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 = .;
+}
-- 
2.1.0



More information about the CRIU mailing list