meta: scripts - relocation script adapted to support big-endian machines

Message ID 20220405095819.533001-1-sundeep.kokkonda@gmail.com
State Accepted, archived
Commit 7d6f4b1373e4dfafc63702ef2426cd45100f18a3
Headers show
Series meta: scripts - relocation script adapted to support big-endian machines | expand

Commit Message

Sundeep KOKKONDA April 5, 2022, 9:58 a.m. UTC
relocate_sdk.py was developed for little-endian architures and when tries
to install SDK for big-endian machines errors like below will be shown.
Error: struct.error: unpack requires a string argument of length 32. SDK could
not be set up. Relocate script failed. Abort!
Error: IOError: [Errno 22] Invalid argument. SDK could not be set up. Relocate
script failed. Abort!

To fix this, script is modified to support big-endian architecture.

Signed-off-by: Sundeep KOKKONDA <sundeep.kokkonda@gmail.com>
---
 scripts/relocate_sdk.py | 25 ++++++++++++++++---------
 1 file changed, 16 insertions(+), 9 deletions(-)

Comments

Alexandre Belloni April 5, 2022, 1:30 p.m. UTC | #1
Hello,

This build is carrying both this patch and

meta: rust: Bug fix for target definitions returning 'NoneType'

which is now present in master.

Could you check:

https://autobuilder.yoctoproject.org/typhoon/#/builders/106/builds/3963/steps/11/logs/stdio

ERROR: rust-cross-cortexa8hf-neon-glibc-1.59.0-r0 do_rust_gen_targets: Error executing a python function in exec_func_python() autogenerated:
The stack trace of python calls that resulted in this exception/failure was:
File: 'exec_func_python() autogenerated', lineno: 2, function: <module>
     0001:
 *** 0002:do_rust_gen_targets(d)
     0003:
File: '/home/pokybuild/yocto-worker/beaglebone-alt/build/meta/recipes-devtools/rust/rust-cross.inc', lineno: 19, function: do_rust_gen_targets
     0015:            if arch == "arm" and target_is_armv7(d):
     0016:                arch = 'armv7'
     0017:            features = d.getVar('TARGET_LLVM_FEATURES') or ""
     0018:            cpu = d.getVar('TARGET_LLVM_CPU')
 *** 0019:        rust_gen_target(d, thing, wd, features, cpu, arch, abi)
     0020:}
     0021:
     0022:# Otherwise we'll depend on what we provide
     0023:INHIBIT_DEFAULT_RUST_DEPS = "1"
File: '/home/pokybuild/yocto-worker/beaglebone-alt/build/meta/recipes-devtools/rust/rust-common.inc', lineno: 330, function: rust_gen_target
     0326:    # build tspec
     0327:    tspec = {}
     0328:    tspec['llvm-target'] = d.getVarFlag('LLVM_TARGET', arch_abi)
     0329:    tspec['data-layout'] = d.getVarFlag('DATA_LAYOUT', arch_abi)
 *** 0330:    tspec['max-atomic-width'] = int(d.getVarFlag('MAX_ATOMIC_WIDTH', arch_abi))
     0331:    tspec['target-pointer-width'] = d.getVarFlag('TARGET_POINTER_WIDTH', arch_abi)
     0332:    tspec['target-c-int-width'] = d.getVarFlag('TARGET_C_INT_WIDTH', arch_abi)
     0333:    tspec['target-endian'] = d.getVarFlag('TARGET_ENDIAN', arch_abi)
     0334:    tspec['arch'] = arch_to_rust_target_arch(rust_arch)
Exception: TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'


I expect other similar failures in https://autobuilder.yoctoproject.org/typhoon/#/builders/83/builds/3478

On 05/04/2022 15:28:19+0530, Sundeep KOKKONDA wrote:
> relocate_sdk.py was developed for little-endian architures and when tries
> to install SDK for big-endian machines errors like below will be shown.
> Error: struct.error: unpack requires a string argument of length 32. SDK could
> not be set up. Relocate script failed. Abort!
> Error: IOError: [Errno 22] Invalid argument. SDK could not be set up. Relocate
> script failed. Abort!
> 
> To fix this, script is modified to support big-endian architecture.
> 
> Signed-off-by: Sundeep KOKKONDA <sundeep.kokkonda@gmail.com>
> ---
>  scripts/relocate_sdk.py | 25 ++++++++++++++++---------
>  1 file changed, 16 insertions(+), 9 deletions(-)
> 
> diff --git a/scripts/relocate_sdk.py b/scripts/relocate_sdk.py
> index 8c0fdb986a..4ed8bfc0d1 100755
> --- a/scripts/relocate_sdk.py
> +++ b/scripts/relocate_sdk.py
> @@ -30,9 +30,16 @@ else:
>  old_prefix = re.compile(b("##DEFAULT_INSTALL_DIR##"))
>  
>  def get_arch():
> +    global endian_prefix
>      f.seek(0)
>      e_ident =f.read(16)
> -    ei_mag0,ei_mag1_3,ei_class = struct.unpack("<B3sB11x", e_ident)
> +    ei_mag0,ei_mag1_3,ei_class,ei_data,ei_version = struct.unpack("<B3sBBB9x", e_ident)
> +
> +    # ei_data = 1 for little-endian & 0 for big-endian
> +    if ei_data == 1:
> +        endian_prefix = '<'
> +    else:
> +        endian_prefix = '>'
>  
>      if (ei_mag0 != 0x7f and ei_mag1_3 != "ELF") or ei_class == 0:
>          return 0
> @@ -51,11 +58,11 @@ def parse_elf_header():
>  
>      if arch == 32:
>          # 32bit
> -        hdr_fmt = "<HHILLLIHHHHHH"
> +        hdr_fmt = endian_prefix + "HHILLLIHHHHHH"
>          hdr_size = 52
>      else:
>          # 64bit
> -        hdr_fmt = "<HHIQQQIHHHHHH"
> +        hdr_fmt = endian_prefix + "HHIQQQIHHHHHH"
>          hdr_size = 64
>  
>      e_type, e_machine, e_version, e_entry, e_phoff, e_shoff, e_flags,\
> @@ -64,9 +71,9 @@ def parse_elf_header():
>  
>  def change_interpreter(elf_file_name):
>      if arch == 32:
> -        ph_fmt = "<IIIIIIII"
> +        ph_fmt = endian_prefix + "IIIIIIII"
>      else:
> -        ph_fmt = "<IIQQQQQQ"
> +        ph_fmt = endian_prefix + "IIQQQQQQ"
>  
>      """ look for PT_INTERP section """
>      for i in range(0,e_phnum):
> @@ -105,17 +112,17 @@ def change_interpreter(elf_file_name):
>  
>  def change_dl_sysdirs(elf_file_name):
>      if arch == 32:
> -        sh_fmt = "<IIIIIIIIII"
> +        sh_fmt = endian_prefix + "IIIIIIIIII"
>      else:
> -        sh_fmt = "<IIQQQQIIQQ"
> +        sh_fmt = endian_prefix + "IIQQQQIIQQ"
>  
>      """ read section string table """
>      f.seek(e_shoff + e_shstrndx * e_shentsize)
>      sh_hdr = f.read(e_shentsize)
>      if arch == 32:
> -        sh_offset, sh_size = struct.unpack("<16xII16x", sh_hdr)
> +        sh_offset, sh_size = struct.unpack(endian_prefix + "16xII16x", sh_hdr)
>      else:
> -        sh_offset, sh_size = struct.unpack("<24xQQ24x", sh_hdr)
> +        sh_offset, sh_size = struct.unpack(endian_prefix + "24xQQ24x", sh_hdr)
>  
>      f.seek(sh_offset)
>      sh_strtab = f.read(sh_size)
> -- 
> 2.25.1
> 

> 
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#164012): https://lists.openembedded.org/g/openembedded-core/message/164012
> Mute This Topic: https://lists.openembedded.org/mt/90261992/3617179
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alexandre.belloni@bootlin.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
Alexandre Belloni April 5, 2022, 6:24 p.m. UTC | #2
On 05/04/2022 15:30:12+0200, Alexandre Belloni wrote:
> Hello,
> 
> This build is carrying both this patch and
> 
> meta: rust: Bug fix for target definitions returning 'NoneType'
> 
> which is now present in master.

We came to the conclusion that this patch was the culprit and has been
reverted for now. The issue seems to be that this change doesn't change
the taskhash and something else is causing a rebuild.

> 
> Could you check:
> 
> https://autobuilder.yoctoproject.org/typhoon/#/builders/106/builds/3963/steps/11/logs/stdio
> 
> ERROR: rust-cross-cortexa8hf-neon-glibc-1.59.0-r0 do_rust_gen_targets: Error executing a python function in exec_func_python() autogenerated:
> The stack trace of python calls that resulted in this exception/failure was:
> File: 'exec_func_python() autogenerated', lineno: 2, function: <module>
>      0001:
>  *** 0002:do_rust_gen_targets(d)
>      0003:
> File: '/home/pokybuild/yocto-worker/beaglebone-alt/build/meta/recipes-devtools/rust/rust-cross.inc', lineno: 19, function: do_rust_gen_targets
>      0015:            if arch == "arm" and target_is_armv7(d):
>      0016:                arch = 'armv7'
>      0017:            features = d.getVar('TARGET_LLVM_FEATURES') or ""
>      0018:            cpu = d.getVar('TARGET_LLVM_CPU')
>  *** 0019:        rust_gen_target(d, thing, wd, features, cpu, arch, abi)
>      0020:}
>      0021:
>      0022:# Otherwise we'll depend on what we provide
>      0023:INHIBIT_DEFAULT_RUST_DEPS = "1"
> File: '/home/pokybuild/yocto-worker/beaglebone-alt/build/meta/recipes-devtools/rust/rust-common.inc', lineno: 330, function: rust_gen_target
>      0326:    # build tspec
>      0327:    tspec = {}
>      0328:    tspec['llvm-target'] = d.getVarFlag('LLVM_TARGET', arch_abi)
>      0329:    tspec['data-layout'] = d.getVarFlag('DATA_LAYOUT', arch_abi)
>  *** 0330:    tspec['max-atomic-width'] = int(d.getVarFlag('MAX_ATOMIC_WIDTH', arch_abi))
>      0331:    tspec['target-pointer-width'] = d.getVarFlag('TARGET_POINTER_WIDTH', arch_abi)
>      0332:    tspec['target-c-int-width'] = d.getVarFlag('TARGET_C_INT_WIDTH', arch_abi)
>      0333:    tspec['target-endian'] = d.getVarFlag('TARGET_ENDIAN', arch_abi)
>      0334:    tspec['arch'] = arch_to_rust_target_arch(rust_arch)
> Exception: TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
> 
> 
> I expect other similar failures in https://autobuilder.yoctoproject.org/typhoon/#/builders/83/builds/3478
> 
> On 05/04/2022 15:28:19+0530, Sundeep KOKKONDA wrote:
> > relocate_sdk.py was developed for little-endian architures and when tries
> > to install SDK for big-endian machines errors like below will be shown.
> > Error: struct.error: unpack requires a string argument of length 32. SDK could
> > not be set up. Relocate script failed. Abort!
> > Error: IOError: [Errno 22] Invalid argument. SDK could not be set up. Relocate
> > script failed. Abort!
> > 
> > To fix this, script is modified to support big-endian architecture.
> > 
> > Signed-off-by: Sundeep KOKKONDA <sundeep.kokkonda@gmail.com>
> > ---
> >  scripts/relocate_sdk.py | 25 ++++++++++++++++---------
> >  1 file changed, 16 insertions(+), 9 deletions(-)
> > 
> > diff --git a/scripts/relocate_sdk.py b/scripts/relocate_sdk.py
> > index 8c0fdb986a..4ed8bfc0d1 100755
> > --- a/scripts/relocate_sdk.py
> > +++ b/scripts/relocate_sdk.py
> > @@ -30,9 +30,16 @@ else:
> >  old_prefix = re.compile(b("##DEFAULT_INSTALL_DIR##"))
> >  
> >  def get_arch():
> > +    global endian_prefix
> >      f.seek(0)
> >      e_ident =f.read(16)
> > -    ei_mag0,ei_mag1_3,ei_class = struct.unpack("<B3sB11x", e_ident)
> > +    ei_mag0,ei_mag1_3,ei_class,ei_data,ei_version = struct.unpack("<B3sBBB9x", e_ident)
> > +
> > +    # ei_data = 1 for little-endian & 0 for big-endian
> > +    if ei_data == 1:
> > +        endian_prefix = '<'
> > +    else:
> > +        endian_prefix = '>'
> >  
> >      if (ei_mag0 != 0x7f and ei_mag1_3 != "ELF") or ei_class == 0:
> >          return 0
> > @@ -51,11 +58,11 @@ def parse_elf_header():
> >  
> >      if arch == 32:
> >          # 32bit
> > -        hdr_fmt = "<HHILLLIHHHHHH"
> > +        hdr_fmt = endian_prefix + "HHILLLIHHHHHH"
> >          hdr_size = 52
> >      else:
> >          # 64bit
> > -        hdr_fmt = "<HHIQQQIHHHHHH"
> > +        hdr_fmt = endian_prefix + "HHIQQQIHHHHHH"
> >          hdr_size = 64
> >  
> >      e_type, e_machine, e_version, e_entry, e_phoff, e_shoff, e_flags,\
> > @@ -64,9 +71,9 @@ def parse_elf_header():
> >  
> >  def change_interpreter(elf_file_name):
> >      if arch == 32:
> > -        ph_fmt = "<IIIIIIII"
> > +        ph_fmt = endian_prefix + "IIIIIIII"
> >      else:
> > -        ph_fmt = "<IIQQQQQQ"
> > +        ph_fmt = endian_prefix + "IIQQQQQQ"
> >  
> >      """ look for PT_INTERP section """
> >      for i in range(0,e_phnum):
> > @@ -105,17 +112,17 @@ def change_interpreter(elf_file_name):
> >  
> >  def change_dl_sysdirs(elf_file_name):
> >      if arch == 32:
> > -        sh_fmt = "<IIIIIIIIII"
> > +        sh_fmt = endian_prefix + "IIIIIIIIII"
> >      else:
> > -        sh_fmt = "<IIQQQQIIQQ"
> > +        sh_fmt = endian_prefix + "IIQQQQIIQQ"
> >  
> >      """ read section string table """
> >      f.seek(e_shoff + e_shstrndx * e_shentsize)
> >      sh_hdr = f.read(e_shentsize)
> >      if arch == 32:
> > -        sh_offset, sh_size = struct.unpack("<16xII16x", sh_hdr)
> > +        sh_offset, sh_size = struct.unpack(endian_prefix + "16xII16x", sh_hdr)
> >      else:
> > -        sh_offset, sh_size = struct.unpack("<24xQQ24x", sh_hdr)
> > +        sh_offset, sh_size = struct.unpack(endian_prefix + "24xQQ24x", sh_hdr)
> >  
> >      f.seek(sh_offset)
> >      sh_strtab = f.read(sh_size)
> > -- 
> > 2.25.1
> > 
> 
> > 
> > -=-=-=-=-=-=-=-=-=-=-=-
> > Links: You receive all messages sent to this group.
> > View/Reply Online (#164012): https://lists.openembedded.org/g/openembedded-core/message/164012
> > Mute This Topic: https://lists.openembedded.org/mt/90261992/3617179
> > Group Owner: openembedded-core+owner@lists.openembedded.org
> > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alexandre.belloni@bootlin.com]
> > -=-=-=-=-=-=-=-=-=-=-=-
> > 
> 
> 
> -- 
> Alexandre Belloni, co-owner and COO, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com

Patch

diff --git a/scripts/relocate_sdk.py b/scripts/relocate_sdk.py
index 8c0fdb986a..4ed8bfc0d1 100755
--- a/scripts/relocate_sdk.py
+++ b/scripts/relocate_sdk.py
@@ -30,9 +30,16 @@  else:
 old_prefix = re.compile(b("##DEFAULT_INSTALL_DIR##"))
 
 def get_arch():
+    global endian_prefix
     f.seek(0)
     e_ident =f.read(16)
-    ei_mag0,ei_mag1_3,ei_class = struct.unpack("<B3sB11x", e_ident)
+    ei_mag0,ei_mag1_3,ei_class,ei_data,ei_version = struct.unpack("<B3sBBB9x", e_ident)
+
+    # ei_data = 1 for little-endian & 0 for big-endian
+    if ei_data == 1:
+        endian_prefix = '<'
+    else:
+        endian_prefix = '>'
 
     if (ei_mag0 != 0x7f and ei_mag1_3 != "ELF") or ei_class == 0:
         return 0
@@ -51,11 +58,11 @@  def parse_elf_header():
 
     if arch == 32:
         # 32bit
-        hdr_fmt = "<HHILLLIHHHHHH"
+        hdr_fmt = endian_prefix + "HHILLLIHHHHHH"
         hdr_size = 52
     else:
         # 64bit
-        hdr_fmt = "<HHIQQQIHHHHHH"
+        hdr_fmt = endian_prefix + "HHIQQQIHHHHHH"
         hdr_size = 64
 
     e_type, e_machine, e_version, e_entry, e_phoff, e_shoff, e_flags,\
@@ -64,9 +71,9 @@  def parse_elf_header():
 
 def change_interpreter(elf_file_name):
     if arch == 32:
-        ph_fmt = "<IIIIIIII"
+        ph_fmt = endian_prefix + "IIIIIIII"
     else:
-        ph_fmt = "<IIQQQQQQ"
+        ph_fmt = endian_prefix + "IIQQQQQQ"
 
     """ look for PT_INTERP section """
     for i in range(0,e_phnum):
@@ -105,17 +112,17 @@  def change_interpreter(elf_file_name):
 
 def change_dl_sysdirs(elf_file_name):
     if arch == 32:
-        sh_fmt = "<IIIIIIIIII"
+        sh_fmt = endian_prefix + "IIIIIIIIII"
     else:
-        sh_fmt = "<IIQQQQIIQQ"
+        sh_fmt = endian_prefix + "IIQQQQIIQQ"
 
     """ read section string table """
     f.seek(e_shoff + e_shstrndx * e_shentsize)
     sh_hdr = f.read(e_shentsize)
     if arch == 32:
-        sh_offset, sh_size = struct.unpack("<16xII16x", sh_hdr)
+        sh_offset, sh_size = struct.unpack(endian_prefix + "16xII16x", sh_hdr)
     else:
-        sh_offset, sh_size = struct.unpack("<24xQQ24x", sh_hdr)
+        sh_offset, sh_size = struct.unpack(endian_prefix + "24xQQ24x", sh_hdr)
 
     f.seek(sh_offset)
     sh_strtab = f.read(sh_size)