[pve-devel] [RFC pve-container 1/2] detect_architecture: use ELF mach9ine header to detect ISA

Thomas Lamprecht t.lamprecht at proxmox.com
Fri Sep 14 14:12:42 CEST 2018


On 9/14/18 1:31 PM, Dietmar Maurer wrote:
> We can now detect arm64 containers.
> 
> Signed-off-by: Dietmar Maurer <dietmar at proxmox.com>
> ---
>  src/PVE/LXC/Config.pm |  2 +-
>  src/PVE/LXC/Create.pm | 22 +++++++++++++---------
>  2 files changed, 14 insertions(+), 10 deletions(-)
> 
> diff --git a/src/PVE/LXC/Config.pm b/src/PVE/LXC/Config.pm
> index 3b1e2df..196cfac 100644
> --- a/src/PVE/LXC/Config.pm
> +++ b/src/PVE/LXC/Config.pm
> @@ -295,7 +295,7 @@ my $confdesc = {
>      arch => {
>  	optional => 1,
>  	type => 'string',
> -	enum => ['amd64', 'i386'],
> +	enum => ['amd64', 'i386', 'arm64'],
>  	description => "OS architecture type.",
>  	default => 'amd64',
>      },
> diff --git a/src/PVE/LXC/Create.pm b/src/PVE/LXC/Create.pm
> index cf73dba..1bb60bc 100644
> --- a/src/PVE/LXC/Create.pm
> +++ b/src/PVE/LXC/Create.pm
> @@ -17,9 +17,12 @@ use POSIX;
>  sub detect_architecture {
>      my ($rootdir) = @_;
>  
> -    my $supported_elf_class = {
> -	1 => 'i386',
> -	2 => 'amd64',
> +    # see https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
> +
> +    my $supported_elf_machine = {
> +	0x03 => 'i386',
> +	0x3e => 'amd64',
> +	0xb7 => 'arm64',
>      };
>  
>      my $elf_fn = '/bin/sh'; # '/bin/sh' is POSIX mandatory
> @@ -32,18 +35,19 @@ sub detect_architecture {
>  	open(my $fh, "<", $elf_fn) or die "open '$elf_fn' failed: $!\n";
>  	binmode($fh);
>  
> -	my $length = read($fh, my $data, 5) or die "read failed: $!\n";
> +	my $length = read($fh, my $data, 20) or die "read failed: $!\n";
>  
> -	# 4 bytes ELF magic number and 1 byte ELF class
> -	my ($magic, $class) = unpack("A4C", $data);
> +	# 4 bytes ELF magic number and 1 byte ELF class, padding, machine
> +	my ($magic, $class, undef, $machine) = unpack("A4CA12n", $data);
>  
>  	die "'$elf_fn' does not resolve to an ELF!\n"
>  	    if (!defined($class) || !defined($magic) || $magic ne "\177ELF");
>  
> -	die "'$elf_fn' has unknown ELF class '$class'!\n"
> -	    if !defined($supported_elf_class->{$class});
> +	my $arch = $supported_elf_machine->{$machine};
> +	die "'$elf_fn' has unknown ELF machine '$machine'!\n"
> +	    if !defined($arch);
>  
> -	return $supported_elf_class->{$class};
> +	return $arch;
>      };
>  
>      my $arch = eval { PVE::Tools::run_fork_with_timeout(5, $detect_arch) };
> 

Reviewed-by: Thomas Lamprecht <t.lamprecht at proxmox.com>



More information about the pve-devel mailing list