libebl: Do not require EI_OSABI for IFUNC.

Message ID 87cbeb0f-a329-ed9f-2d8b-35277cd0e5e6@suse.cz
State Dropped
Headers
Series libebl: Do not require EI_OSABI for IFUNC. |

Commit Message

Martin Liška Nov. 24, 2022, 12:23 p.m. UTC
  Similar fix to:
https://sourceware.org/bugzilla/show_bug.cgi?id=29718

Ready for master?
Thanks,
Martin

	PR 29826

libebl/ChangeLog:

	* eblsymboltypename.c (ebl_symbol_type_name):
	Do not require EI_OSABI for IFUNC
---
 libebl/eblsymboltypename.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
  

Comments

Mark Wielaard Nov. 24, 2022, 12:33 p.m. UTC | #1
Hi Martin,

On Thu, 2022-11-24 at 13:23 +0100, Martin Liška wrote:
> Similar fix to:
> https://sourceware.org/bugzilla/show_bug.cgi?id=29718
> 
> Ready for master?

Assuming runtime, glibc/ld.so, accepts this without EI_OSABI set to
ELFOSABI_LINUX, it seems ok to print it as GNU_IFUNC.

> 	  else if (symbol == STT_GNU_IFUNC
>  		   && ebl != NULL
> -		   && (ident = elf_getident (ebl->elf, NULL)) != NULL
> -		   && ident[EI_OSABI] == ELFOSABI_LINUX)
> -	    return "GNU_IFUNC";
> +		   && (ident = elf_getident (ebl->elf, NULL)) != NULL)
> +	    return "GNU_IFUNC"; /* Ignore EI_OSABI
> +                             as STT_GNU_IFUNC is a reserved name.  */

Note that you technically also don't need the elf_getident call
anymore, except as sanity check that the ELF header can be read
properly.

OK, with and without that change.

Cheers,

Mark
  
Martin Liška Nov. 25, 2022, 1:06 p.m. UTC | #2
On 11/24/22 13:33, Mark Wielaard wrote:
> Hi Martin,
> 
> On Thu, 2022-11-24 at 13:23 +0100, Martin Liška wrote:
>> Similar fix to:
>> https://sourceware.org/bugzilla/show_bug.cgi?id=29718
>>
>> Ready for master?
> 
> Assuming runtime, glibc/ld.so, accepts this without EI_OSABI set to
> ELFOSABI_LINUX, it seems ok to print it as GNU_IFUNC.
> 
>> 	  else if (symbol == STT_GNU_IFUNC
>>  		   && ebl != NULL
>> -		   && (ident = elf_getident (ebl->elf, NULL)) != NULL
>> -		   && ident[EI_OSABI] == ELFOSABI_LINUX)
>> -	    return "GNU_IFUNC";
>> +		   && (ident = elf_getident (ebl->elf, NULL)) != NULL)
>> +	    return "GNU_IFUNC"; /* Ignore EI_OSABI
>> +                             as STT_GNU_IFUNC is a reserved name.  */
> 
> Note that you technically also don't need the elf_getident call
> anymore, except as sanity check that the ELF header can be read
> properly.
> 
> OK, with and without that change.

Sorry, I decided to scratch this as it violates the standard:
https://sourceware.org/bugzilla/show_bug.cgi?id=29718#c6

Cheers,
Martin

> 
> Cheers,
> 
> Mark
  

Patch

diff --git a/libebl/eblsymboltypename.c b/libebl/eblsymboltypename.c
index 0ff1722a..3b8e7ee9 100644
--- a/libebl/eblsymboltypename.c
+++ b/libebl/eblsymboltypename.c
@@ -65,9 +65,9 @@  ebl_symbol_type_name (Ebl *ebl, int symbol, char *buf, size_t len)
 	    snprintf (buf, len, "LOPROC+%d", symbol - STT_LOPROC);
 	  else if (symbol == STT_GNU_IFUNC
 		   && ebl != NULL
-		   && (ident = elf_getident (ebl->elf, NULL)) != NULL
-		   && ident[EI_OSABI] == ELFOSABI_LINUX)
-	    return "GNU_IFUNC";
+		   && (ident = elf_getident (ebl->elf, NULL)) != NULL)
+	    return "GNU_IFUNC"; /* Ignore EI_OSABI
+                             as STT_GNU_IFUNC is a reserved name.  */
 	  else if (symbol >= STT_LOOS && symbol <= STT_HIOS)
 	    snprintf (buf, len, "LOOS+%d", symbol - STT_LOOS);
 	  else