[CRIU] Re: [PATCH 04/13] make: Generate offsets from linked files only

Pavel Emelyanov xemul at parallels.com
Wed Apr 18 04:18:34 EDT 2012


On 04/18/2012 01:55 AM, Cyrill Gorcunov wrote:
> Instead of generating offsets from early compiled
> object files (one day the offsets obtained from
> there might be changed during linkage stage) better
> to get them from a final stage where all object
> files involved are linked into complete binary blob.
> 
> That happened that at early stage we indeed were using
> only single file per parasite and restorer but at present
> there a couple of file involved (and will be more in
> future) so we need a safe approach.
> 
> Also note the symbols being exported are prefixed as
> "__export_". This is easier approach for now. Putting
> such symbols into separate section requires a way
> more efforts to handle.
> 
> Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
> ---
>  Makefile           |    6 ++++--
>  cr-restore.c       |    4 ++--
>  gen-offsets.sh     |    4 ++--
>  include/parasite.h |    6 +++---
>  include/restorer.h |    4 ++--
>  parasite.c         |   16 ++++++++--------
>  pie.lds.S          |    3 ---
>  restorer.c         |    4 ++--
>  8 files changed, 23 insertions(+), 24 deletions(-)
> 
> diff --git a/Makefile b/Makefile
> index aa2f801..0a6df29 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -89,7 +89,8 @@ parasite-util-net.o: util-net.c
>  
>  $(HEAD-BIN): $(PIE-LDS) $(OBJS-BLOB) parasite-util-net.o
>  	$(E) "  GEN     " $@
> -	$(Q) $(LD) -T $(PIE-LDS) $(OBJS-BLOB) parasite-util-net.o -o $@
> +	$(Q) $(LD) --oformat=binary -T $(PIE-LDS) $(OBJS-BLOB) parasite-util-net.o -o $@
> +	$(Q) $(LD) --oformat=elf64-x86-64 -T $(PIE-LDS) $(OBJS-BLOB) parasite-util-net.o -o $@.o

Why do we need the .bin file then? AFAIS the .bin.o is only used next, what do I miss?

>  $(HEAD-BLOB-GEN): $(HEAD-BIN) $(GEN-OFFSETS)
>  	$(E) "  GEN     " $@
> @@ -102,7 +103,8 @@ $(ROBJS): $(RSRCS-BLOB)
>  
>  $(RHEAD-BIN): $(ROBJS) $(PIE-LDS)
>  	$(E) "  GEN     " $@
> -	$(Q) $(LD) -T $(PIE-LDS) $(ROBJS) -o $@
> +	$(Q) $(LD) --oformat=binary -T $(PIE-LDS) $(ROBJS) -o $@
> +	$(Q) $(LD) --oformat=elf64-x86-64 -T $(PIE-LDS) $(ROBJS) -o $@.o
>  
>  $(RHEAD-BLOB-GEN): $(RHEAD-BIN) $(GEN-OFFSETS)
>  	$(E) "  GEN     " $@
> diff --git a/cr-restore.c b/cr-restore.c
> index 1cf475c..2cbd037 100644
> --- a/cr-restore.c
> +++ b/cr-restore.c
> @@ -1229,8 +1229,8 @@ static int sigreturn_restore(pid_t pid, struct list_head *tgt_vmas, int nr_vmas)
>  	 * might be completely unused so it's here just for convenience.
>  	 */
>  	restore_code_start		= mem;
> -	restore_thread_exec_start	= restore_code_start + restorer_blob_offset__restore_thread;
> -	restore_task_exec_start		= restore_code_start + restorer_blob_offset__restore_task;
> +	restore_thread_exec_start	= restore_code_start + restorer_blob_offset____export_restore_thread;
> +	restore_task_exec_start		= restore_code_start + restorer_blob_offset____export_restore_task;
>  	task_args			= restore_code_start + restore_code_len;
>  	thread_args			= (void *)((long)task_args + sizeof(*task_args));
>  
> diff --git a/gen-offsets.sh b/gen-offsets.sh
> index 545b6d7..cc5c6fd 100644
> --- a/gen-offsets.sh
> +++ b/gen-offsets.sh
> @@ -7,7 +7,7 @@ NAME=$1
>  INC_GUARD=__${NAME}_h__
>  PREFIX=${NAME}_blob_offset__
>  BLOB=${NAME}_blob
> -OBJNAME=${NAME}.o
> +OBJNAME=${NAME}.bin.o
>  BINARY=${NAME}.bin
>  
>  AWK_CMD='$2 ~ /^[tT]$/ { print "#define '$PREFIX'" $3 " 0x" $1; }'
> @@ -19,7 +19,7 @@ cat << EOF
>  
>  EOF
>  
> -nm $OBJNAME | tr . _ | awk "$AWK_CMD"
> +nm $OBJNAME | grep "__export_" | tr . _ | awk "$AWK_CMD"
>  
>  cat << EOF
>  
> diff --git a/include/parasite.h b/include/parasite.h
> index 0bd01b5..038fb5c 100644
> --- a/include/parasite.h
> +++ b/include/parasite.h
> @@ -96,10 +96,10 @@ struct parasite_drain_fd {
>   */
>  
>  #define PARASITE_ARGS_ADDR(start)				\
> -	((start) + parasite_blob_offset__parasite_args)
> +	((start) + parasite_blob_offset____export_parasite_args)
>  #define PARASITE_CMD_ADDR(start)				\
> -	((start) + parasite_blob_offset__parasite_cmd)
> +	((start) + parasite_blob_offset____export_parasite_cmd)
>  #define PARASITE_HEAD_ADDR(start)				\
> -	((start) + parasite_blob_offset__parasite_head_start)
> +	((start) + parasite_blob_offset____export_parasite_head_start)
>  
>  #endif /* CR_PARASITE_H_ */
> diff --git a/include/restorer.h b/include/restorer.h
> index cbb6a28..4a75763 100644
> --- a/include/restorer.h
> +++ b/include/restorer.h
> @@ -18,8 +18,8 @@
>  struct task_restore_core_args;
>  struct thread_restore_args;
>  
> -extern long restore_task(struct task_restore_core_args *args);
> -extern long restore_thread(struct thread_restore_args *args);
> +extern long __export_restore_task(struct task_restore_core_args *args);
> +extern long __export_restore_thread(struct thread_restore_args *args);
>  
>  typedef long (*task_restore_fcall_t) (struct task_restore_core_args *args);
>  typedef long (*thread_restore_fcall_t) (struct thread_restore_args *args);
> diff --git a/parasite.c b/parasite.c
> index 26b334a..a2e0042 100644
> --- a/parasite.c
> +++ b/parasite.c
> @@ -487,30 +487,30 @@ static int __used parasite_service(unsigned long cmd, void *args)
>  	return -1;
>  }
>  
> -static void __head parasite_head(void)
> +static void __head __export_parasite_head(void)
>  {
>  	/*
>  	 * The linker will handle the stack allocation.
>  	 */
> -	asm volatile("parasite_head_start:				\n"
> -		     "leaq parasite_stack(%rip), %rsp			\n"
> +	asm volatile("__export_parasite_head_start:			\n"
> +		     "leaq __export_parasite_stack(%rip), %rsp		\n"
>  		     "subq $16, %rsp					\n"
>  		     "andq $~15, %rsp					\n"
>  		     "pushq $0						\n"
>  		     "movq %rsp, %rbp					\n"
> -		     "movl parasite_cmd(%rip), %edi			\n"
> -		     "leaq parasite_args(%rip), %rsi			\n"
> +		     "movl __export_parasite_cmd(%rip), %edi		\n"
> +		     "leaq __export_parasite_args(%rip), %rsi		\n"
>  		     "call parasite_service				\n"
>  		     "parasite_service_complete:			\n"
>  		     "int $0x03						\n"
>  		     ".align 8						\n"
> -		     "parasite_cmd:					\n"
> +		     "__export_parasite_cmd:				\n"
>  		     ".long 0						\n"
> -		     "parasite_args:					\n"
> +		     "__export_parasite_args:				\n"
>  		     ".long 0						\n"
>  		     ".space "__stringify(PARASITE_ARG_SIZE)",0		\n"
>  		     ".space "__stringify(PARASITE_STACK_SIZE)", 0	\n"
> -		     "parasite_stack:					\n"
> +		     "__export_parasite_stack:				\n"
>  		     ".long 0						\n");
>  }
>  
> diff --git a/pie.lds.S b/pie.lds.S
> index 0d513e8..9873a63 100644
> --- a/pie.lds.S
> +++ b/pie.lds.S
> @@ -1,4 +1,3 @@
> -OUTPUT_FORMAT("binary")
>  OUTPUT_ARCH(i386:x86-64)
>  
>  SECTIONS
> @@ -13,8 +12,6 @@ SECTIONS
>  		. = ALIGN(32);
>  		*(.bss*)
>  		. = ALIGN(32);
> -		*(.export)
> -		. = ALIGN(32);

Just don't add them in patch #3 and that's it.

>  	} =0x00000000
>  
>  	/DISCARD/ : {
> diff --git a/restorer.c b/restorer.c
> index fc95e83..4cf688b 100644
> --- a/restorer.c
> +++ b/restorer.c
> @@ -128,7 +128,7 @@ static void restore_creds(struct creds_entry *ce)
>   * Threads restoration via sigreturn. Note it's locked
>   * routine and calls for unlock at the end.
>   */
> -long restore_thread(struct thread_restore_args *args)
> +long __export_restore_thread(struct thread_restore_args *args)
>  {
>  	long ret = -1;
>  	struct core_entry *core_entry;
> @@ -335,7 +335,7 @@ static u64 restore_mapping(const struct vma_entry *vma_entry)
>   * and jump execution to some predefined ip read from
>   * core file.
>   */
> -long restore_task(struct task_restore_core_args *args)
> +long __export_restore_task(struct task_restore_core_args *args)
>  {
>  	long ret = -1;
>  	struct task_entry *task_entry;



More information about the CRIU mailing list