[CRIU] Re: [PATCH 3/6] parasite: Build offsets from already linked elf file

Pavel Emelyanov xemul at parallels.com
Tue Feb 14 09:18:10 EST 2012


On 02/14/2012 05:41 PM, Cyrill Gorcunov wrote:
> Offsets to parasite should be built from linked elf
> file otherwise some offsets might be wrong.

OK.

> Moreover, to simplify parasite building procedure do not
> compile util-net.c twice, simply make recv_fd to be static
> function in header. 

NAK. I'd prefer building it twice.

> Having two object files linked into injectable code is not
> what we need here.

Having N object files linked into parasite IS what we need.

> Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
> ---
>  Makefile           |   16 +++++++++-------
>  include/util-net.h |   39 +++++++++++++++++++++++++++++++++++++--
>  parasite.lds.S     |   13 ++++++++++++-
>  util-net.c         |   36 +-----------------------------------
>  4 files changed, 59 insertions(+), 45 deletions(-)
> 
> diff --git a/Makefile b/Makefile
> index adfc7ea..ad775db 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -49,6 +49,7 @@ SRCS-BLOB	+= $(patsubst %.o,%.c,$(OBJS-BLOB))
>  
>  HEAD-BLOB-GEN	:= $(patsubst %.o,%-blob.h,$(OBJS-BLOB))
>  HEAD-BIN	:= $(patsubst %.o,%.bin,$(OBJS-BLOB))
> +HEAD-ELF	:= $(patsubst %.o,%.elf,$(OBJS-BLOB))
>  HEAD-LDS	:= $(patsubst %.o,%.lds.S,$(OBJS-BLOB))
>  
>  ROBJS-BLOB	:= restorer.o
> @@ -77,21 +78,21 @@ $(OBJS-BLOB): $(SRCS-BLOB)
>  	$(E) "  CC      " $@
>  	$(Q) $(CC) -c $(CFLAGS) -fpic $< -o $@
>  
> -parasite-util-net.o: util-net.c
> -	$(E) "  CC      " $@
> -	$(Q) $(CC) -c $(CFLAGS) -fpic $< -o $@
> +$(HEAD-ELF): $(HEAD-LDS) $(OBJS-BLOB)
> +	$(E) "  GEN     " $@
> +	$(Q) $(LD) --oformat "elf64-x86-64" -T $(HEAD-LDS) $(OBJS-BLOB) -o $@
>  
> -$(HEAD-BIN): $(HEAD-LDS) $(OBJS-BLOB) parasite-util-net.o
> +$(HEAD-BIN): $(HEAD-LDS) $(HEAD-ELF) $(OBJS-BLOB)
>  	$(E) "  GEN     " $@
> -	$(Q) $(LD) -T $^ -o $@
> +	$(Q) $(LD) --oformat "binary" -T $(HEAD-LDS) $(OBJS-BLOB) -o $@
>  
> -$(HEAD-BLOB-GEN): $(HEAD-BIN)
> +$(HEAD-BLOB-GEN): $(HEAD-BIN) $(HEAD-ELF) $(HEAD-LDS) $(OBJS-BLOB)
>  	$(E) "  GEN     " $@
>  	$(Q) $(SH) gen-offsets.sh			\
>  		parasite_h__				\
>  		parasite_blob_offset__			\
>  		parasite_blob				\
> -		$(OBJS-BLOB)				\
> +		$(HEAD-ELF)				\
>  		$(HEAD-BIN) > parasite-blob.h
>  	$(Q) sync
>  
> @@ -160,6 +161,7 @@ clean:
>  	$(Q) $(RM) -f ./*.img
>  	$(Q) $(RM) -f ./*.out
>  	$(Q) $(RM) -f ./*.bin
> +	$(Q) $(RM) -f ./*.elf
>  	$(Q) $(RM) -f ./$(PROGRAM)
>  	$(Q) $(RM) -f ./$(HEAD-BLOB-GEN)
>  	$(Q) $(RM) -f ./$(RHEAD-BLOB-GEN)
> diff --git a/include/util-net.h b/include/util-net.h
> index dbcad61..28b0926 100644
> --- a/include/util-net.h
> +++ b/include/util-net.h
> @@ -1,9 +1,44 @@
>  #ifndef UTIL_NET_H_
>  #define UTIL_NET_H_
>  
> +#include <sys/socket.h>
> +#include <sys/un.h>
> +
> +#include "syscall.h"
> +
>  #define UNIX_PATH_MAX (sizeof(struct sockaddr_un) - \
>  			(size_t)((struct sockaddr_un *) 0)->sun_path)
>  
>  extern int send_fd(int sock, struct sockaddr_un *saddr, int len, int fd);
> -extern int recv_fd(int sock);
> -#endif
> +
> +static int recv_fd(int sock)
> +{
> +	char ccmsg[CMSG_SPACE(sizeof(int))];
> +	struct msghdr msg = { };
> +	struct iovec iov = { };
> +	struct cmsghdr *cmsg;
> +	int *cmsg_data;
> +	char buf[1];
> +	int ret;
> +
> +	iov.iov_base	= buf;
> +	iov.iov_len	= 1;
> +
> +	msg.msg_iov	= &iov;
> +	msg.msg_iovlen	= 1;
> +	msg.msg_control	= ccmsg;
> +	msg.msg_controllen = sizeof(ccmsg);
> +
> +	ret = sys_recvmsg(sock, &msg, 0);
> +	if (ret < 0)
> +		return ret;
> +
> +	cmsg = CMSG_FIRSTHDR(&msg);
> +	if (!cmsg || !cmsg->cmsg_type == SCM_RIGHTS)
> +		return -2;
> +
> +	cmsg_data = (int *)CMSG_DATA(cmsg);
> +	return *cmsg_data;
> +}
> +
> +#endif /* UTIL_NET_H_ */
> diff --git a/parasite.lds.S b/parasite.lds.S
> index 0f3aa32..55b5b78 100644
> --- a/parasite.lds.S
> +++ b/parasite.lds.S
> @@ -1,6 +1,9 @@
> -OUTPUT_FORMAT("binary")
>  OUTPUT_ARCH(i386:x86-64)
>  
> +/*
> + * Target should be provided by option
> + */
> +
>  SECTIONS
>  {
>  	. = 0;
> @@ -10,10 +13,18 @@ SECTIONS
>  		. = ALIGN(8);
>  	}
>  	.data : {
> +		*(.parasite.data)
>  		*(.data)
>  		*(.rodata)
> +		*(.rodata.*)
>  		*(.bss)
>  		*(.parasite.stack)
>  		. = ALIGN(8);
>  	}
> +
> +	/* Sections to be discarded */
> +	/DISCARD/ : {
> +		*(.eh_frame)
> +		*(.comment)
> +	}
>  }
> diff --git a/util-net.c b/util-net.c
> index dad02c4..f110e09 100644
> --- a/util-net.c
> +++ b/util-net.c
> @@ -1,7 +1,4 @@
> -#include <sys/socket.h>
> -#include <sys/un.h>
> -
> -#include "syscall.h"
> +#include "util-net.h"
>  
>  int send_fd(int sock, struct sockaddr_un *saddr, int len, int fd)
>  {
> @@ -33,34 +30,3 @@ int send_fd(int sock, struct sockaddr_un *saddr, int len, int fd)
>  
>  	return sys_sendmsg(sock, &hdr, 0);
>  }
> -
> -int recv_fd(int sock)
> -{
> -	char ccmsg[CMSG_SPACE(sizeof(int))];
> -	struct msghdr msg = { };
> -	struct iovec iov = { };
> -	struct cmsghdr *cmsg;
> -	int *cmsg_data;
> -	char buf[1];
> -	int ret;
> -
> -	iov.iov_base	= buf;
> -	iov.iov_len	= 1;
> -
> -	msg.msg_iov	= &iov;
> -	msg.msg_iovlen	= 1;
> -	msg.msg_control	= ccmsg;
> -	msg.msg_controllen = sizeof(ccmsg);
> -
> -	ret = sys_recvmsg(sock, &msg, 0);
> -	if (ret < 0)
> -		return ret;
> -
> -	cmsg = CMSG_FIRSTHDR(&msg);
> -	if (!cmsg || !cmsg->cmsg_type == SCM_RIGHTS)
> -		return -2;
> -
> -	cmsg_data = (int *)CMSG_DATA(cmsg);
> -	return *cmsg_data;
> -}
> -



More information about the CRIU mailing list