Re: [PATCH v2 2/6] BaseTools GenFw: Support CLANG8ELF with conversion ELF to PE/COFF image


Ni, Ray
 

Leif,
OVMF Bhyve GCC build succeeds without GenFW assertion issue.

I dumped the ELF image generated for OvmfPkg/Bhyve/AcpiTables/AcpiTables.
Below output shows that .text does have "AX" set:

---
$ readelf -S Hpet.dll
...
[ 1] .text PROGBITS 0000000000000000 00000140
000000000000000c 0000000000000000 AX 0 0 64
---

It matches IsTextShdr() logic:
return (BOOLEAN) ((Shdr->sh_flags & (SHF_EXECINSTR | SHF_ALLOC)) == (SHF_EXECINSTR | SHF_ALLOC));

Can you please check the .text attributes in your ARM build?
(
I did try to build an ARM platform but failed with following errors:
gcc: error: unrecognized command line option '-mcmodel=small'

I downloaded "arm-none-eabi-gcc" in Ubuntu:
lrwxrwxrwx 1 root root 25 Jun 5 09:18 /usr/bin/gcc -> /usr/bin/arm-non-eabi-gcc
)

-----Original Message-----
From: Ni, Ray
Sent: Saturday, June 5, 2021 8:07 AM
To: Leif Lindholm <leif@...>; devel@edk2.groups.io
Cc: Liming Gao <gaoliming@...>; Feng, Bob C <bob.c.feng@...>
Subject: RE: [edk2-devel] [PATCH v2 2/6] BaseTools GenFw: Support CLANG8ELF with conversion ELF to PE/COFF image

Leif,
Sorry to hear that. It seems a CI gap that doesn't capture such errors.
It looks like the logic update to detect .text section doesn't work in your case.

I am trying to build the OVMF Bhyve because I saw it contains an AcpiTables module that has .aslc file.

Thanks,
Ray


-----Original Message-----
From: Leif Lindholm <leif@...>
Sent: Friday, June 4, 2021 9:31 PM
To: devel@edk2.groups.io; Ni, Ray <ray.ni@...>
Cc: Liming Gao <gaoliming@...>; Feng, Bob C <bob.c.feng@...>
Subject: Re: [edk2-devel] [PATCH v2 2/6] BaseTools GenFw: Support CLANG8ELF with conversion ELF to PE/COFF image

Hi Ray,

On Wed, Jun 02, 2021 at 16:11:41 +0800, Ni, Ray wrote:
From: Liming Gao <gaoliming@...>

CLANG8ELF tool chain generated ELF image with the different attributes
in section. Update GenFw to handle them.
1. .text section with writable attribute (support)
2. .reloc section has the symbol for *ABS* (skip)

Signed-off-by: Liming Gao <gaoliming@...>
Reviewed-by: Feng Bob C <bob.c.feng@...>
This commit breaks many of the ARM platforms.

I end up seeing

GenFw: Elf64Convert.c:719: ScanSections64: Assertion `FALSE' failed.

when generating certain ACPI tables.

Note: this applies to both GCC5 and CLANG38 - it is not isolated to
CLANG8ELF.

Reverting to commit c1aa3bab1259 makes these builds work again.

/
Leif

---
BaseTools/Source/C/GenFw/Elf32Convert.c | 12 +++---------
BaseTools/Source/C/GenFw/Elf64Convert.c | 5 +++--
2 files changed, 6 insertions(+), 11 deletions(-)

diff --git a/BaseTools/Source/C/GenFw/Elf32Convert.c b/BaseTools/Source/C/GenFw/Elf32Convert.c
index 2485b2cb7a..7c8a065678 100644
--- a/BaseTools/Source/C/GenFw/Elf32Convert.c
+++ b/BaseTools/Source/C/GenFw/Elf32Convert.c
@@ -238,7 +238,7 @@ IsTextShdr (
Elf_Shdr *Shdr
)
{
- return (BOOLEAN) ((Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == SHF_ALLOC);
+ return (BOOLEAN) ((Shdr->sh_flags & (SHF_EXECINSTR | SHF_ALLOC)) == (SHF_EXECINSTR | SHF_ALLOC));
}

STATIC
@@ -261,7 +261,7 @@ IsDataShdr (
if (IsHiiRsrcShdr(Shdr)) {
return FALSE;
}
- return (BOOLEAN) (Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == (SHF_ALLOC | SHF_WRITE);
+ return (BOOLEAN) (Shdr->sh_flags & (SHF_EXECINSTR | SHF_WRITE | SHF_ALLOC)) == (SHF_ALLOC | SHF_WRITE);
}

STATIC
@@ -749,13 +749,7 @@ WriteSections32 (
if (SymName == NULL) {
SymName = (const UINT8 *)"<unknown>";
}
-
- Error (NULL, 0, 3000, "Invalid",
- "%s: Bad definition for symbol '%s'@%#x or unsupported symbol type. "
- "For example, absolute and undefined symbols are not supported.",
- mInImageName, SymName, Sym->st_value);
-
- exit(EXIT_FAILURE);
+ continue;
}
SymShdr = GetShdrByIndex(Sym->st_shndx);

diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c b/BaseTools/Source/C/GenFw/Elf64Convert.c
index d097db8632..8fe672e984 100644
--- a/BaseTools/Source/C/GenFw/Elf64Convert.c
+++ b/BaseTools/Source/C/GenFw/Elf64Convert.c
@@ -246,7 +246,7 @@ IsTextShdr (
Elf_Shdr *Shdr
)
{
- return (BOOLEAN) ((Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == SHF_ALLOC);
+ return (BOOLEAN) ((Shdr->sh_flags & (SHF_EXECINSTR | SHF_ALLOC)) == (SHF_EXECINSTR | SHF_ALLOC));
}

STATIC
@@ -269,7 +269,7 @@ IsDataShdr (
if (IsHiiRsrcShdr(Shdr)) {
return FALSE;
}
- return (BOOLEAN) (Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == (SHF_ALLOC | SHF_WRITE);
+ return (BOOLEAN) (Shdr->sh_flags & (SHF_EXECINSTR | SHF_WRITE | SHF_ALLOC)) == (SHF_ALLOC | SHF_WRITE);
}

STATIC
@@ -1060,6 +1060,7 @@ WriteSections64 (

exit(EXIT_FAILURE);
}
+ continue;
}
SymShdr = GetShdrByIndex(Sym->st_shndx);

--
2.31.1.windows.1





Join devel@edk2.groups.io to automatically receive all group messages.