public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] Replace ROUND with ALIGN_UP by p_align [BZ #22370]
@ 2017-10-31 12:56 H.J. Lu
  2017-10-31 13:49 ` Andreas Schwab
  0 siblings, 1 reply; 16+ messages in thread
From: H.J. Lu @ 2017-10-31 12:56 UTC (permalink / raw)
  To: GNU C Library

Alignment of notes in PT_NOTE segment is specified by the p_align field
in the PT_NOTE segment header.  This patch replaces ROUND with ALIGN_UP
by p_align to scan notes in PT_NOTE segment.

Tested on i686 and x86-64.  Any comments?

H.J.
---
	[BZ #22370]
	* dl-hwcaps.c (ROUND): Removed.
	(_dl_important_hwcaps): Replace ROUND with ALIGN_UP by p_align.
	* elf/dl-load.c (ROUND): Removed.
	(open_verify): Replace ROUND with ALIGN_UP by p_align.
	* elf/readelflib.c (ROUND): Removed.
	(process_elf_file): Replace ROUND with ALIGN_UP by p_align.
---
 elf/dl-hwcaps.c  | 9 +++++----
 elf/dl-load.c    | 6 +++---
 elf/readelflib.c | 6 +++---
 3 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/elf/dl-hwcaps.c b/elf/dl-hwcaps.c
index 92f2eb45ce..de271a6fc8 100644
--- a/elf/dl-hwcaps.c
+++ b/elf/dl-hwcaps.c
@@ -67,6 +67,7 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
 	  {
 	    const ElfW(Addr) start = (phdr[i].p_vaddr
 				      + GLRO(dl_sysinfo_map)->l_addr);
+	    const ElfW(Addr) align = phdr[i].p_align;
 	    /* The standard ELF note layout is exactly as the anonymous struct.
 	       The next element is a variable length vendor name of length
 	       VENDORLEN (with a real length rounded to ElfW(Word)), followed
@@ -80,7 +81,6 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
 	    } *note = (const void *) start;
 	    while ((ElfW(Addr)) (note + 1) - start < phdr[i].p_memsz)
 	      {
-#define ROUND(len) (((len) + sizeof (ElfW(Word)) - 1) & -sizeof (ElfW(Word)))
 		/* The layout of the type 2, vendor "GNU" note is as follows:
 		   .long <Number of capabilities enabled by this note>
 		   .long <Capabilities mask> (as mask >> _DL_FIRST_EXTRA).
@@ -92,7 +92,8 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
 		    && note->datalen > 2 * sizeof (ElfW(Word)) + 2)
 		  {
 		    const ElfW(Word) *p = ((const void *) (note + 1)
-					   + ROUND (sizeof "GNU"));
+					   + ALIGN_UP (sizeof "GNU",
+						       sizeof (ElfW(Word))));
 		    cnt += *p++;
 		    ++p;	/* Skip mask word.  */
 		    dsocaps = (const char *) p; /* Pseudo-string "<b>name"  */
@@ -100,8 +101,8 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
 		    break;
 		  }
 		note = ((const void *) (note + 1)
-			+ ROUND (note->vendorlen) + ROUND (note->datalen));
-#undef ROUND
+			+ ALIGN_UP (note->vendorlen, align)
+			+ ALIGN_UP (note->datalen, align));
 	      }
 	    if (dsocaps != NULL)
 	      break;
diff --git a/elf/dl-load.c b/elf/dl-load.c
index 1220183ce2..8fdfadd41e 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -1683,6 +1683,7 @@ open_verify (const char *name, int fd,
 	if (ph->p_type == PT_NOTE && ph->p_filesz >= 32 && ph->p_align >= 4)
 	  {
 	    ElfW(Addr) size = ph->p_filesz;
+	    ElfW(Addr) align = ph->p_align;
 
 	    if (ph->p_offset + size <= (size_t) fbp->len)
 	      abi_note = (void *) (fbp->buf + ph->p_offset);
@@ -1696,10 +1697,9 @@ open_verify (const char *name, int fd,
 
 	    while (memcmp (abi_note, &expected_note, sizeof (expected_note)))
 	      {
-#define ROUND(len) (((len) + sizeof (ElfW(Word)) - 1) & -sizeof (ElfW(Word)))
 		ElfW(Addr) note_size = 3 * sizeof (ElfW(Word))
-				       + ROUND (abi_note[0])
-				       + ROUND (abi_note[1]);
+				       + ALIGN_UP (abi_note[0], align)
+				       + ALIGN_UP (abi_note[1], align);
 
 		if (size - 32 < note_size)
 		  {
diff --git a/elf/readelflib.c b/elf/readelflib.c
index 9ad56dcc34..247afa7de2 100644
--- a/elf/readelflib.c
+++ b/elf/readelflib.c
@@ -131,15 +131,15 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
 	      ElfW(Word) *abi_note = (ElfW(Word) *) (file_contents
 						     + segment->p_offset);
 	      ElfW(Addr) size = segment->p_filesz;
+	      ElfW(Addr) align = segment->p_align;
 
 	      while (abi_note [0] != 4 || abi_note [1] != 16
 		     || abi_note [2] != 1
 		     || memcmp (abi_note + 3, "GNU", 4) != 0)
 		{
-#define ROUND(len) (((len) + sizeof (ElfW(Word)) - 1) & -sizeof (ElfW(Word)))
 		  ElfW(Addr) note_size = 3 * sizeof (ElfW(Word))
-					 + ROUND (abi_note[0])
-					 + ROUND (abi_note[1]);
+				         + ALIGN_UP (abi_note[0], align)
+				         + ALIGN_UP (abi_note[1], align);
 
 		  if (size - 32 < note_size || note_size == 0)
 		    {
-- 
2.13.6

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] Replace ROUND with ALIGN_UP by p_align [BZ #22370]
  2017-10-31 12:56 [PATCH] Replace ROUND with ALIGN_UP by p_align [BZ #22370] H.J. Lu
@ 2017-10-31 13:49 ` Andreas Schwab
  2017-10-31 13:57   ` H.J. Lu
  0 siblings, 1 reply; 16+ messages in thread
From: Andreas Schwab @ 2017-10-31 13:49 UTC (permalink / raw)
  To: H.J. Lu; +Cc: GNU C Library

On Okt 31 2017, "H.J. Lu" <hjl.tools@gmail.com> wrote:

> Alignment of notes in PT_NOTE segment is specified by the p_align field
> in the PT_NOTE segment header.

I don't think it makes sense to alter the note contents due to p_align,
it should only control the padding between each note.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] Replace ROUND with ALIGN_UP by p_align [BZ #22370]
  2017-10-31 13:49 ` Andreas Schwab
@ 2017-10-31 13:57   ` H.J. Lu
  2017-11-11  0:26     ` H.J. Lu
  0 siblings, 1 reply; 16+ messages in thread
From: H.J. Lu @ 2017-10-31 13:57 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: GNU C Library

On Tue, Oct 31, 2017 at 6:49 AM, Andreas Schwab <schwab@linux-m68k.org> wrote:
> On Okt 31 2017, "H.J. Lu" <hjl.tools@gmail.com> wrote:
>
>> Alignment of notes in PT_NOTE segment is specified by the p_align field
>> in the PT_NOTE segment header.
>
> I don't think it makes sense to alter the note contents due to p_align,
> it should only control the padding between each note.
>

Isn't padding between each note determined by alignment of note?
Linker creates one PT_NOTE segment for notes with the same alignment:

There are 38 section headers, starting at offset 0x493f30:

Section Headers:
  [Nr] Name              Type            Address          Off    Size
 ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000
000000 00      0   0  0
  [ 1] .note.gnu.property NOTE            00000000004001c8 0001c8
000020 00   A  0   0  8
  [ 2] .note.ABI-tag     NOTE            00000000004001e8 0001e8
000020 00   A  0   0  4
  [ 3] .note.gnu.build-id NOTE            0000000000400208 000208
000024 00   A  0   0  4
readelf: Warning: [ 4]: Link field (0) should index a symtab section.
  [ 4] .rela.plt         RELA            0000000000400230 000230
000210 18  AI  0  23  8
  [ 5] .init             PROGBITS        0000000000400440 000440
000017 00  AX  0   0  4
  [ 6] .plt              PROGBITS        0000000000400460 000460
000160 00  AX  0   0 16
  [ 7] .text             PROGBITS        00000000004005c0 0005c0
0730e0 00  AX  0   0 16
  [ 8] __libc_freeres_fn PROGBITS        00000000004736a0 0736a0
000aa7 00  AX  0   0 16
  [ 9] __libc_thread_freeres_fn PROGBITS        0000000000474150
074150 00015d 00  AX  0   0 16
  [10] .fini             PROGBITS        00000000004742b0 0742b0
000009 00  AX  0   0  4
  [11] .rodata           PROGBITS        00000000004742c0 0742c0
01c138 00   A  0   0 32
  [12] __libc_subfreeres PROGBITS        00000000004903f8 0903f8
000048 00   A  0   0  8
  [13] __libc_IO_vtables PROGBITS        0000000000490440 090440
0006a8 00   A  0   0 32
  [14] __libc_atexit     PROGBITS        0000000000490ae8 090ae8
000008 00   A  0   0  8
  [15] __libc_thread_subfreeres PROGBITS        0000000000490af0
090af0 000010 00   A  0   0  8
  [16] .eh_frame         PROGBITS        0000000000490b00 090b00
009cd0 00   A  0   0  8
  [17] .gcc_except_table PROGBITS        000000000049a7d0 09a7d0
0000a1 00   A  0   0  1
  [18] .tdata            PROGBITS        000000000069ab40 09ab40
000020 00 WAT  0   0  8
  [19] .tbss             NOBITS          000000000069ab60 09ab60
000040 00 WAT  0   0  8
  [20] .init_array       INIT_ARRAY      000000000069ab60 09ab60
000010 08  WA  0   0  8
  [21] .fini_array       FINI_ARRAY      000000000069ab70 09ab70
000010 08  WA  0   0  8
  [22] .data.rel.ro      PROGBITS        000000000069ab80 09ab80
000464 00  WA  0   0 32
  [23] .got.plt          PROGBITS        000000000069b000 09b000
0000c8 08  WA  0   0  8
  [24] .data             PROGBITS        000000000069b0e0 09b0e0
001ae8 00  WA  0   0 32
  [25] .bss              NOBITS          000000000069cbe0 09cbc8
0014e8 00  WA  0   0 32
  [26] __libc_freeres_ptrs NOBITS          000000000069e0c8 09cbc8
000028 00  WA  0   0  8
  [27] .comment          PROGBITS        0000000000000000 09cbc8
000029 01  MS  0   0  1
  [28] .debug_aranges    PROGBITS        0000000000000000 09cc00
004450 00      0   0 16
  [29] .debug_info       PROGBITS        0000000000000000 0a1050
261a05 00      0   0  1
  [30] .debug_abbrev     PROGBITS        0000000000000000 302a55
039aa2 00      0   0  1
  [31] .debug_line       PROGBITS        0000000000000000 33c4f7
0680f6 00      0   0  1
  [32] .debug_str        PROGBITS        0000000000000000 3a45ed
011e67 01  MS  0   0  1
  [33] .debug_loc        PROGBITS        0000000000000000 3b6454
0b41e9 00      0   0  1
  [34] .debug_ranges     PROGBITS        0000000000000000 46a640
016d00 00      0   0 16
  [35] .symtab           SYMTAB          0000000000000000 481340
00ba30 18     36 880  8
  [36] .strtab           STRTAB          0000000000000000 48cd70
006ffc 00      0   0  1
  [37] .shstrtab         STRTAB          0000000000000000 493d6c
0001c1 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),
  l (large), p (processor specific)

Elf file type is EXEC (Executable file)
Entry point 0x4015a0
There are 7 program headers, starting at offset 64

Program Headers:
  Type           Offset   VirtAddr           PhysAddr
FileSiz  MemSiz   Flg Align
  LOAD           0x000000 0x0000000000400000 0x0000000000400000
0x09a871 0x09a871 R E 0x200000
  LOAD           0x09ab40 0x000000000069ab40 0x000000000069ab40
0x002088 0x0035b0 RW  0x200000
  NOTE           0x0001c8 0x00000000004001c8 0x00000000004001c8
0x000020 0x000020 R   0x8
  NOTE           0x0001e8 0x00000000004001e8 0x00000000004001e8
0x000044 0x000044 R   0x4
  TLS            0x09ab40 0x000000000069ab40 0x000000000069ab40
0x000020 0x000060 R   0x8
  GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000
0x000000 0x000000 RW  0x10
  GNU_RELRO      0x09ab40 0x000000000069ab40 0x000000000069ab40
0x0004c0 0x0004c0 R   0x1

 Section to Segment mapping:
  Segment Sections...
   00     .note.gnu.property .note.ABI-tag .note.gnu.build-id
.rela.plt .init .plt .text __libc_freeres_fn __libc_thread_freeres_fn
.fini .rodata __libc_subfreeres __libc_IO_vtables __libc_atexit
__libc_thread_subfreeres .eh_frame .gcc_except_table
   01     .tdata .init_array .fini_array .data.rel.ro .got.plt .data
.bss __libc_freeres_ptrs
   02     .note.gnu.property
   03     .note.ABI-tag .note.gnu.build-id
   04     .tdata .tbss
   05
   06     .tdata .init_array .fini_array .data.rel.ro



-- 
H.J.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] Replace ROUND with ALIGN_UP by p_align [BZ #22370]
  2017-10-31 13:57   ` H.J. Lu
@ 2017-11-11  0:26     ` H.J. Lu
  2017-11-11 12:39       ` Andreas Schwab
  0 siblings, 1 reply; 16+ messages in thread
From: H.J. Lu @ 2017-11-11  0:26 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: GNU C Library

On Tue, Oct 31, 2017 at 6:57 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Tue, Oct 31, 2017 at 6:49 AM, Andreas Schwab <schwab@linux-m68k.org> wrote:
>> On Okt 31 2017, "H.J. Lu" <hjl.tools@gmail.com> wrote:
>>
>>> Alignment of notes in PT_NOTE segment is specified by the p_align field
>>> in the PT_NOTE segment header.
>>
>> I don't think it makes sense to alter the note contents due to p_align,
>> it should only control the padding between each note.
>>
>
> Isn't padding between each note determined by alignment of note?
> Linker creates one PT_NOTE segment for notes with the same alignment:
>
> There are 38 section headers, starting at offset 0x493f30:
>
> Section Headers:
>   [Nr] Name              Type            Address          Off    Size
>  ES Flg Lk Inf Al
>   [ 0]                   NULL            0000000000000000 000000
> 000000 00      0   0  0
>   [ 1] .note.gnu.property NOTE            00000000004001c8 0001c8
> 000020 00   A  0   0  8
>   [ 2] .note.ABI-tag     NOTE            00000000004001e8 0001e8
> 000020 00   A  0   0  4
>   [ 3] .note.gnu.build-id NOTE            0000000000400208 000208
> 000024 00   A  0   0  4
> readelf: Warning: [ 4]: Link field (0) should index a symtab section.
>   [ 4] .rela.plt         RELA            0000000000400230 000230
> 000210 18  AI  0  23  8
>   [ 5] .init             PROGBITS        0000000000400440 000440
> 000017 00  AX  0   0  4
>   [ 6] .plt              PROGBITS        0000000000400460 000460
> 000160 00  AX  0   0 16
>   [ 7] .text             PROGBITS        00000000004005c0 0005c0
> 0730e0 00  AX  0   0 16
>   [ 8] __libc_freeres_fn PROGBITS        00000000004736a0 0736a0
> 000aa7 00  AX  0   0 16
>   [ 9] __libc_thread_freeres_fn PROGBITS        0000000000474150
> 074150 00015d 00  AX  0   0 16
>   [10] .fini             PROGBITS        00000000004742b0 0742b0
> 000009 00  AX  0   0  4
>   [11] .rodata           PROGBITS        00000000004742c0 0742c0
> 01c138 00   A  0   0 32
>   [12] __libc_subfreeres PROGBITS        00000000004903f8 0903f8
> 000048 00   A  0   0  8
>   [13] __libc_IO_vtables PROGBITS        0000000000490440 090440
> 0006a8 00   A  0   0 32
>   [14] __libc_atexit     PROGBITS        0000000000490ae8 090ae8
> 000008 00   A  0   0  8
>   [15] __libc_thread_subfreeres PROGBITS        0000000000490af0
> 090af0 000010 00   A  0   0  8
>   [16] .eh_frame         PROGBITS        0000000000490b00 090b00
> 009cd0 00   A  0   0  8
>   [17] .gcc_except_table PROGBITS        000000000049a7d0 09a7d0
> 0000a1 00   A  0   0  1
>   [18] .tdata            PROGBITS        000000000069ab40 09ab40
> 000020 00 WAT  0   0  8
>   [19] .tbss             NOBITS          000000000069ab60 09ab60
> 000040 00 WAT  0   0  8
>   [20] .init_array       INIT_ARRAY      000000000069ab60 09ab60
> 000010 08  WA  0   0  8
>   [21] .fini_array       FINI_ARRAY      000000000069ab70 09ab70
> 000010 08  WA  0   0  8
>   [22] .data.rel.ro      PROGBITS        000000000069ab80 09ab80
> 000464 00  WA  0   0 32
>   [23] .got.plt          PROGBITS        000000000069b000 09b000
> 0000c8 08  WA  0   0  8
>   [24] .data             PROGBITS        000000000069b0e0 09b0e0
> 001ae8 00  WA  0   0 32
>   [25] .bss              NOBITS          000000000069cbe0 09cbc8
> 0014e8 00  WA  0   0 32
>   [26] __libc_freeres_ptrs NOBITS          000000000069e0c8 09cbc8
> 000028 00  WA  0   0  8
>   [27] .comment          PROGBITS        0000000000000000 09cbc8
> 000029 01  MS  0   0  1
>   [28] .debug_aranges    PROGBITS        0000000000000000 09cc00
> 004450 00      0   0 16
>   [29] .debug_info       PROGBITS        0000000000000000 0a1050
> 261a05 00      0   0  1
>   [30] .debug_abbrev     PROGBITS        0000000000000000 302a55
> 039aa2 00      0   0  1
>   [31] .debug_line       PROGBITS        0000000000000000 33c4f7
> 0680f6 00      0   0  1
>   [32] .debug_str        PROGBITS        0000000000000000 3a45ed
> 011e67 01  MS  0   0  1
>   [33] .debug_loc        PROGBITS        0000000000000000 3b6454
> 0b41e9 00      0   0  1
>   [34] .debug_ranges     PROGBITS        0000000000000000 46a640
> 016d00 00      0   0 16
>   [35] .symtab           SYMTAB          0000000000000000 481340
> 00ba30 18     36 880  8
>   [36] .strtab           STRTAB          0000000000000000 48cd70
> 006ffc 00      0   0  1
>   [37] .shstrtab         STRTAB          0000000000000000 493d6c
> 0001c1 00      0   0  1
> Key to Flags:
>   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
>   L (link order), O (extra OS processing required), G (group), T (TLS),
>   C (compressed), x (unknown), o (OS specific), E (exclude),
>   l (large), p (processor specific)
>
> Elf file type is EXEC (Executable file)
> Entry point 0x4015a0
> There are 7 program headers, starting at offset 64
>
> Program Headers:
>   Type           Offset   VirtAddr           PhysAddr
> FileSiz  MemSiz   Flg Align
>   LOAD           0x000000 0x0000000000400000 0x0000000000400000
> 0x09a871 0x09a871 R E 0x200000
>   LOAD           0x09ab40 0x000000000069ab40 0x000000000069ab40
> 0x002088 0x0035b0 RW  0x200000
>   NOTE           0x0001c8 0x00000000004001c8 0x00000000004001c8
> 0x000020 0x000020 R   0x8
>   NOTE           0x0001e8 0x00000000004001e8 0x00000000004001e8
> 0x000044 0x000044 R   0x4
>   TLS            0x09ab40 0x000000000069ab40 0x000000000069ab40
> 0x000020 0x000060 R   0x8
>   GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000
> 0x000000 0x000000 RW  0x10
>   GNU_RELRO      0x09ab40 0x000000000069ab40 0x000000000069ab40
> 0x0004c0 0x0004c0 R   0x1
>
>  Section to Segment mapping:
>   Segment Sections...
>    00     .note.gnu.property .note.ABI-tag .note.gnu.build-id
> .rela.plt .init .plt .text __libc_freeres_fn __libc_thread_freeres_fn
> .fini .rodata __libc_subfreeres __libc_IO_vtables __libc_atexit
> __libc_thread_subfreeres .eh_frame .gcc_except_table
>    01     .tdata .init_array .fini_array .data.rel.ro .got.plt .data
> .bss __libc_freeres_ptrs
>    02     .note.gnu.property
>    03     .note.ABI-tag .note.gnu.build-id
>    04     .tdata .tbss
>    05
>    06     .tdata .init_array .fini_array .data.rel.ro
>
>

Hi Andreas,

All notes in a PT_NOTE segment have the same alignment,  Otherwise,
one can't parse PT_NOTE segment.  I will check in my patch next week
if there are no objections.


-- 
H.J.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] Replace ROUND with ALIGN_UP by p_align [BZ #22370]
  2017-11-11  0:26     ` H.J. Lu
@ 2017-11-11 12:39       ` Andreas Schwab
  2017-11-11 14:35         ` H.J. Lu
  0 siblings, 1 reply; 16+ messages in thread
From: Andreas Schwab @ 2017-11-11 12:39 UTC (permalink / raw)
  To: H.J. Lu; +Cc: GNU C Library

On Nov 10 2017, "H.J. Lu" <hjl.tools@gmail.com> wrote:

> All notes in a PT_NOTE segment have the same alignment,  Otherwise,
> one can't parse PT_NOTE segment.

But the ABI says that the name and data size is always aligned to the
word size.  That is independent of the padding between notes.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] Replace ROUND with ALIGN_UP by p_align [BZ #22370]
  2017-11-11 12:39       ` Andreas Schwab
@ 2017-11-11 14:35         ` H.J. Lu
  2017-11-11 14:49           ` Andreas Schwab
  0 siblings, 1 reply; 16+ messages in thread
From: H.J. Lu @ 2017-11-11 14:35 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: GNU C Library

On Sat, Nov 11, 2017 at 4:39 AM, Andreas Schwab <schwab@linux-m68k.org> wrote:
> On Nov 10 2017, "H.J. Lu" <hjl.tools@gmail.com> wrote:
>
>> All notes in a PT_NOTE segment have the same alignment,  Otherwise,
>> one can't parse PT_NOTE segment.
>
> But the ABI says that the name and data size is always aligned to the
> word size.  That is independent of the padding between notes.
>

The gABI says:

In 64-bit objects (files with e_ident[EI_CLASS] equal to ELFCLASS64),
each entry is an array of 8-byte words in the format of the target
processor. In 32-bit objects (files with e_ident[EI_CLASS] equal to
ELFCLASS32), each entry is an array of 4-byte words in the format of
the target processor.

Since .note.ABI-tag and .note.gnu.build-id notes are aligned to 4
bytes in 64-bit object while .note.gnu.property notes are aligned
to 8 bytes in 64-bit object, we have to check p_align in program
header for note alignment in PT_NOTE segments.

-- 
H.J.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] Replace ROUND with ALIGN_UP by p_align [BZ #22370]
  2017-11-11 14:35         ` H.J. Lu
@ 2017-11-11 14:49           ` Andreas Schwab
  2017-11-11 15:00             ` H.J. Lu
  0 siblings, 1 reply; 16+ messages in thread
From: Andreas Schwab @ 2017-11-11 14:49 UTC (permalink / raw)
  To: H.J. Lu; +Cc: GNU C Library

On Nov 11 2017, "H.J. Lu" <hjl.tools@gmail.com> wrote:

> The gABI says:
>
> In 64-bit objects (files with e_ident[EI_CLASS] equal to ELFCLASS64),
> each entry is an array of 8-byte words in the format of the target
> processor. In 32-bit objects (files with e_ident[EI_CLASS] equal to
> ELFCLASS32), each entry is an array of 4-byte words in the format of
> the target processor.
>
> Since .note.ABI-tag and .note.gnu.build-id notes are aligned to 4
> bytes in 64-bit object while .note.gnu.property notes are aligned
> to 8 bytes in 64-bit object, we have to check p_align in program
> header for note alignment in PT_NOTE segments.

I don't see any reference to the segment alignment in the quote above.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] Replace ROUND with ALIGN_UP by p_align [BZ #22370]
  2017-11-11 14:49           ` Andreas Schwab
@ 2017-11-11 15:00             ` H.J. Lu
  2017-11-11 15:07               ` Andreas Schwab
  0 siblings, 1 reply; 16+ messages in thread
From: H.J. Lu @ 2017-11-11 15:00 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: GNU C Library

On Sat, Nov 11, 2017 at 6:49 AM, Andreas Schwab <schwab@linux-m68k.org> wrote:
> On Nov 11 2017, "H.J. Lu" <hjl.tools@gmail.com> wrote:
>
>> The gABI says:
>>
>> In 64-bit objects (files with e_ident[EI_CLASS] equal to ELFCLASS64),
>> each entry is an array of 8-byte words in the format of the target
>> processor. In 32-bit objects (files with e_ident[EI_CLASS] equal to
>> ELFCLASS32), each entry is an array of 4-byte words in the format of
>> the target processor.
>>
>> Since .note.ABI-tag and .note.gnu.build-id notes are aligned to 4
>> bytes in 64-bit object while .note.gnu.property notes are aligned
>> to 8 bytes in 64-bit object, we have to check p_align in program
>> header for note alignment in PT_NOTE segments.
>
> I don't see any reference to the segment alignment in the quote above.
>

The full text is

---
Note Section

Sometimes a vendor or system builder needs to mark an object file with
special information that other programs will check for conformance,
compatibility, etc. Sections of type SHT_NOTE and program header
elements of type PT_NOTE can be used for this purpose. The note
information in sections and program header elements holds a variable
amount of entries. In 64-bit objects (files with e_ident[EI_CLASS]
equal to ELFCLASS64), each entry is an array of 8-byte words in the
format of the target processor. In 32-bit objects (files with
e_ident[EI_CLASS] equal to ELFCLASS32), each entry is an array of
4-byte words in the format of the target processor. Labels appear
below to help explain note information organization, but they are not
part of the specification.
---

You tell me what note alignment in PT_NOTE segment is.


-- 
H.J.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] Replace ROUND with ALIGN_UP by p_align [BZ #22370]
  2017-11-11 15:00             ` H.J. Lu
@ 2017-11-11 15:07               ` Andreas Schwab
  2017-11-11 15:25                 ` H.J. Lu
  0 siblings, 1 reply; 16+ messages in thread
From: Andreas Schwab @ 2017-11-11 15:07 UTC (permalink / raw)
  To: H.J. Lu; +Cc: GNU C Library

On Nov 11 2017, "H.J. Lu" <hjl.tools@gmail.com> wrote:

> The full text is
>
> ---
> Note Section
>
> Sometimes a vendor or system builder needs to mark an object file with
> special information that other programs will check for conformance,
> compatibility, etc. Sections of type SHT_NOTE and program header
> elements of type PT_NOTE can be used for this purpose. The note
> information in sections and program header elements holds a variable
> amount of entries. In 64-bit objects (files with e_ident[EI_CLASS]
> equal to ELFCLASS64), each entry is an array of 8-byte words in the
> format of the target processor. In 32-bit objects (files with
> e_ident[EI_CLASS] equal to ELFCLASS32), each entry is an array of
> 4-byte words in the format of the target processor. Labels appear
> below to help explain note information organization, but they are not
> part of the specification.
> ---
>
> You tell me what note alignment in PT_NOTE segment is.

I still don't see any reference to the segment alignment.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] Replace ROUND with ALIGN_UP by p_align [BZ #22370]
  2017-11-11 15:07               ` Andreas Schwab
@ 2017-11-11 15:25                 ` H.J. Lu
  2017-11-11 17:05                   ` Andreas Schwab
  0 siblings, 1 reply; 16+ messages in thread
From: H.J. Lu @ 2017-11-11 15:25 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: GNU C Library

On Sat, Nov 11, 2017 at 7:07 AM, Andreas Schwab <schwab@linux-m68k.org> wrote:
> On Nov 11 2017, "H.J. Lu" <hjl.tools@gmail.com> wrote:
>
>> The full text is
>>
>> ---
>> Note Section
>>
>> Sometimes a vendor or system builder needs to mark an object file with
>> special information that other programs will check for conformance,
>> compatibility, etc. Sections of type SHT_NOTE and program header
>> elements of type PT_NOTE can be used for this purpose. The note
>> information in sections and program header elements holds a variable
>> amount of entries. In 64-bit objects (files with e_ident[EI_CLASS]
>> equal to ELFCLASS64), each entry is an array of 8-byte words in the
>> format of the target processor. In 32-bit objects (files with
>> e_ident[EI_CLASS] equal to ELFCLASS32), each entry is an array of
>> 4-byte words in the format of the target processor. Labels appear
>> below to help explain note information organization, but they are not
>> part of the specification.
>> ---
>>
>> You tell me what note alignment in PT_NOTE segment is.
>
> I still don't see any reference to the segment alignment.
>
> Andreas.
>

If .note.ABI-tag and .note.gnu.build-id notes followed the gABI, they should
have been aligned to 8 bytes in 64-bit objects and we could have assumed
all notes in PT_NOTE segments in 64-bit objects are aligned to 8 bytes.  But
.note.ABI-tag and .note.gnu.build-id notes don't follow the gABI.

p_align in program header is the the maximum alignment of notes in PT_NOTE
segment and linker groups notes with the same alignment in one PT_NOTE
segment.  p_align of PT_NOTE program header is the note alignment.


-- 
H.J.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] Replace ROUND with ALIGN_UP by p_align [BZ #22370]
  2017-11-11 15:25                 ` H.J. Lu
@ 2017-11-11 17:05                   ` Andreas Schwab
  2017-11-12  1:29                     ` H.J. Lu
  0 siblings, 1 reply; 16+ messages in thread
From: Andreas Schwab @ 2017-11-11 17:05 UTC (permalink / raw)
  To: H.J. Lu; +Cc: GNU C Library

On Nov 11 2017, "H.J. Lu" <hjl.tools@gmail.com> wrote:

> If .note.ABI-tag and .note.gnu.build-id notes followed the gABI, they should
> have been aligned to 8 bytes in 64-bit objects and we could have assumed
> all notes in PT_NOTE segments in 64-bit objects are aligned to 8 bytes.  But
> .note.ABI-tag and .note.gnu.build-id notes don't follow the gABI.

How comes this has always been working?

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] Replace ROUND with ALIGN_UP by p_align [BZ #22370]
  2017-11-11 17:05                   ` Andreas Schwab
@ 2017-11-12  1:29                     ` H.J. Lu
  2017-11-12 13:51                       ` Andreas Schwab
  0 siblings, 1 reply; 16+ messages in thread
From: H.J. Lu @ 2017-11-12  1:29 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: GNU C Library

On Sat, Nov 11, 2017 at 9:05 AM, Andreas Schwab <schwab@linux-m68k.org> wrote:
> On Nov 11 2017, "H.J. Lu" <hjl.tools@gmail.com> wrote:
>
>> If .note.ABI-tag and .note.gnu.build-id notes followed the gABI, they should
>> have been aligned to 8 bytes in 64-bit objects and we could have assumed
>> all notes in PT_NOTE segments in 64-bit objects are aligned to 8 bytes.  But
>> .note.ABI-tag and .note.gnu.build-id notes don't follow the gABI.
>
> How comes this has always been working?
>

Before

commit 62753d2c09108550650ab83a69e99ca28d8bde3b
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Fri Aug 18 08:49:07 2017 -0700

    Add NT_GNU_PROPERTY_TYPE_0 macros

    Add macros used in GNU .note.gnu.property notes (NT_GNU_PROPERTY_TYPE_0).

            * elf/elf.h (NT_GNU_PROPERTY_TYPE_0): New.
            (NOTE_GNU_PROPERTY_SECTION_NAME): Likewise.

glibc never saw other notes.  .note.gnu.property note uses the same GNU note
format as .note.ABI-tag and .note.gnu.build-id notes, but it is
aligned to 8 bytes in
64-bit objects.  My patch fixes glibc so that it can parse GNU notes
aligned to either
4 bytes or 8 bytes.


-- 
H.J.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] Replace ROUND with ALIGN_UP by p_align [BZ #22370]
  2017-11-12  1:29                     ` H.J. Lu
@ 2017-11-12 13:51                       ` Andreas Schwab
  2017-11-12 14:56                         ` H.J. Lu
  0 siblings, 1 reply; 16+ messages in thread
From: Andreas Schwab @ 2017-11-12 13:51 UTC (permalink / raw)
  To: H.J. Lu; +Cc: GNU C Library

On Nov 11 2017, "H.J. Lu" <hjl.tools@gmail.com> wrote:

> glibc never saw other notes.  .note.gnu.property note uses the same GNU note
> format as .note.ABI-tag and .note.gnu.build-id notes, but it is
> aligned to 8 bytes in
> 64-bit objects.

Wouldn't it be better for .note.gnu.property to follow existing
practice?  It seems like everyone assumes word alignment for notes.
Also note that Elf64_Nhdr consists of odd number of words, which makes
the note data unaligned for xwords, causing the next note to be
unaligned relative to the segment alignment.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] Replace ROUND with ALIGN_UP by p_align [BZ #22370]
  2017-11-12 13:51                       ` Andreas Schwab
@ 2017-11-12 14:56                         ` H.J. Lu
  2017-11-12 16:03                           ` Andreas Schwab
  0 siblings, 1 reply; 16+ messages in thread
From: H.J. Lu @ 2017-11-12 14:56 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: GNU C Library

On Sun, Nov 12, 2017 at 5:51 AM, Andreas Schwab <schwab@linux-m68k.org> wrote:
> On Nov 11 2017, "H.J. Lu" <hjl.tools@gmail.com> wrote:
>
>> glibc never saw other notes.  .note.gnu.property note uses the same GNU note
>> format as .note.ABI-tag and .note.gnu.build-id notes, but it is
>> aligned to 8 bytes in
>> 64-bit objects.
>
> Wouldn't it be better for .note.gnu.property to follow existing
> practice?  It seems like everyone assumes word alignment for notes.

.note.gnu.property supports address/size related properties, which are
64 bits in 64-bit objects.  It is natural to follow the gABI.

> Also note that Elf64_Nhdr consists of odd number of words, which makes
> the note data unaligned for xwords, causing the next note to be
> unaligned relative to the segment alignment.
>

Data after Elf64_Nhdr is the "name" field which is a 4-byte string, "GNU".
There is no misalignment.  The .note.gnu.property note is designed in
such a way that properties can be 64 bits without misalignment in 64-bit
objects:

https://sourceware.org/ml/gnu-gabi/2016-q4/msg00000.html


-- 
H.J.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] Replace ROUND with ALIGN_UP by p_align [BZ #22370]
  2017-11-12 14:56                         ` H.J. Lu
@ 2017-11-12 16:03                           ` Andreas Schwab
  2017-11-15 23:03                             ` H.J. Lu
  0 siblings, 1 reply; 16+ messages in thread
From: Andreas Schwab @ 2017-11-12 16:03 UTC (permalink / raw)
  To: H.J. Lu; +Cc: GNU C Library

On Nov 12 2017, "H.J. Lu" <hjl.tools@gmail.com> wrote:

> Data after Elf64_Nhdr is the "name" field which is a 4-byte string, "GNU".
> There is no misalignment.

That's not what your patch does.  You are aligning both the name length
and the data length to a 8 byte boundary, making the note size
unaligned.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] Replace ROUND with ALIGN_UP by p_align [BZ #22370]
  2017-11-12 16:03                           ` Andreas Schwab
@ 2017-11-15 23:03                             ` H.J. Lu
  0 siblings, 0 replies; 16+ messages in thread
From: H.J. Lu @ 2017-11-15 23:03 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: GNU C Library

On Sun, Nov 12, 2017 at 8:03 AM, Andreas Schwab <schwab@linux-m68k.org> wrote:
> On Nov 12 2017, "H.J. Lu" <hjl.tools@gmail.com> wrote:
>
>> Data after Elf64_Nhdr is the "name" field which is a 4-byte string, "GNU".
>> There is no misalignment.
>
> That's not what your patch does.  You are aligning both the name length
> and the data length to a 8 byte boundary, making the note size
> unaligned.
>

You are right.  Both glibc and binutils get this wrong.  I opened a
binutils bug:

https://sourceware.org/bugzilla/show_bug.cgi?id=22444

I will fix it first and take care of glibc next.

Thanks.

-- 
H.J.

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2017-11-15 23:03 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-31 12:56 [PATCH] Replace ROUND with ALIGN_UP by p_align [BZ #22370] H.J. Lu
2017-10-31 13:49 ` Andreas Schwab
2017-10-31 13:57   ` H.J. Lu
2017-11-11  0:26     ` H.J. Lu
2017-11-11 12:39       ` Andreas Schwab
2017-11-11 14:35         ` H.J. Lu
2017-11-11 14:49           ` Andreas Schwab
2017-11-11 15:00             ` H.J. Lu
2017-11-11 15:07               ` Andreas Schwab
2017-11-11 15:25                 ` H.J. Lu
2017-11-11 17:05                   ` Andreas Schwab
2017-11-12  1:29                     ` H.J. Lu
2017-11-12 13:51                       ` Andreas Schwab
2017-11-12 14:56                         ` H.J. Lu
2017-11-12 16:03                           ` Andreas Schwab
2017-11-15 23:03                             ` H.J. Lu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).