mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 18:14:13 +08:00
objcopy section alignment
bfd_set_section_alignment currently always returns true. This patch changes it to return false on silly alignment values, avoiding yet another way to trigger ubsan errors like coffcode.h:3192:12: runtime error: shift exponent 299 is too large for 32-bit type 'int'. We'll catch that one in objcopy.c:setup_sections. However, setup_sections gives up on other setup operations that are necessary even after an error of some sort. Change that to keep going, which might change the error message but that shouldn't matter in the least. bfd/ * section.c (bfd_set_section_alignment): Return false and don't set alignment_power for stupidly large alignments. * bfd-in2.h: Regenerate. * coffcode.h (coff_compute_section_file_positions): Don't use an int constant when calculating alignment. binutils/ * objcopy.c (setup_section): Keep on going after hitting non-fatal errors.
This commit is contained in:
parent
77b38f6db9
commit
578a7392c3
@ -1201,6 +1201,8 @@ bfd_set_section_lma (asection *sec, bfd_vma val)
|
||||
static inline bool
|
||||
bfd_set_section_alignment (asection *sec, unsigned int val)
|
||||
{
|
||||
if (val >= sizeof (bfd_vma) * 8 - 1)
|
||||
return false;
|
||||
sec->alignment_power = val;
|
||||
return true;
|
||||
}
|
||||
|
@ -3189,7 +3189,7 @@ coff_compute_section_file_positions (bfd * abfd)
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
sofar = BFD_ALIGN (sofar, page_size);
|
||||
#else
|
||||
sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
|
||||
sofar = BFD_ALIGN (sofar, (bfd_vma) 1 << current->alignment_power);
|
||||
#endif
|
||||
|
||||
#ifdef RS6000COFF_C
|
||||
@ -3259,7 +3259,7 @@ coff_compute_section_file_positions (bfd * abfd)
|
||||
|
||||
old_size = current->size;
|
||||
current->size = BFD_ALIGN (current->size,
|
||||
1 << current->alignment_power);
|
||||
(bfd_vma) 1 << current->alignment_power);
|
||||
align_adjust = current->size != old_size;
|
||||
sofar += current->size - old_size;
|
||||
}
|
||||
@ -3269,7 +3269,7 @@ coff_compute_section_file_positions (bfd * abfd)
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
sofar = BFD_ALIGN (sofar, page_size);
|
||||
#else
|
||||
sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
|
||||
sofar = BFD_ALIGN (sofar, (bfd_vma) 1 << current->alignment_power);
|
||||
#endif
|
||||
align_adjust = sofar != old_sofar;
|
||||
current->size += sofar - old_sofar;
|
||||
@ -3315,7 +3315,8 @@ coff_compute_section_file_positions (bfd * abfd)
|
||||
/* Make sure the relocations are aligned. We don't need to make
|
||||
sure that this byte exists, because it will only matter if there
|
||||
really are relocs. */
|
||||
sofar = BFD_ALIGN (sofar, 1 << COFF_DEFAULT_SECTION_ALIGNMENT_POWER);
|
||||
sofar = BFD_ALIGN (sofar,
|
||||
(bfd_vma) 1 << COFF_DEFAULT_SECTION_ALIGNMENT_POWER);
|
||||
|
||||
obj_relocbase (abfd) = sofar;
|
||||
abfd->output_has_begun = true;
|
||||
|
@ -631,6 +631,8 @@ CODE_FRAGMENT
|
||||
.static inline bool
|
||||
.bfd_set_section_alignment (asection *sec, unsigned int val)
|
||||
.{
|
||||
. if (val >= sizeof (bfd_vma) * 8 - 1)
|
||||
. return false;
|
||||
. sec->alignment_power = val;
|
||||
. return true;
|
||||
.}
|
||||
|
@ -4014,7 +4014,7 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
|
||||
bfd_vma vma;
|
||||
bfd_vma lma;
|
||||
flagword flags;
|
||||
const char *err;
|
||||
const char *err = NULL;
|
||||
const char * name;
|
||||
const char * new_name;
|
||||
char *prefix = NULL;
|
||||
@ -4097,10 +4097,7 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
|
||||
else if (extract_symbol)
|
||||
size = 0;
|
||||
if (!bfd_set_section_size (osection, size))
|
||||
{
|
||||
err = _("failed to set size");
|
||||
goto loser;
|
||||
}
|
||||
err = _("failed to set size");
|
||||
|
||||
vma = bfd_section_vma (isection);
|
||||
p = find_section_list (bfd_section_name (isection), false,
|
||||
@ -4116,10 +4113,7 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
|
||||
vma += change_section_address;
|
||||
|
||||
if (!bfd_set_section_vma (osection, vma))
|
||||
{
|
||||
err = _("failed to set vma");
|
||||
goto loser;
|
||||
}
|
||||
err = _("failed to set vma");
|
||||
|
||||
lma = isection->lma;
|
||||
p = find_section_list (bfd_section_name (isection), false,
|
||||
@ -4146,10 +4140,7 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
|
||||
/* FIXME: This is probably not enough. If we change the LMA we
|
||||
may have to recompute the header for the file as well. */
|
||||
if (!bfd_set_section_alignment (osection, alignment))
|
||||
{
|
||||
err = _("failed to set alignment");
|
||||
goto loser;
|
||||
}
|
||||
err = _("failed to set alignment");
|
||||
|
||||
/* Copy merge entity size. */
|
||||
osection->entsize = isection->entsize;
|
||||
@ -4178,16 +4169,13 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
|
||||
/* Allow the BFD backend to copy any private data it understands
|
||||
from the input section to the output section. */
|
||||
if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
|
||||
{
|
||||
err = _("failed to copy private data");
|
||||
goto loser;
|
||||
}
|
||||
err = _("failed to copy private data");
|
||||
|
||||
if (make_nobits)
|
||||
elf_section_type (osection) = SHT_NOBITS;
|
||||
|
||||
/* All went well. */
|
||||
return;
|
||||
if (!err)
|
||||
return;
|
||||
|
||||
loser:
|
||||
status = 1;
|
||||
|
Loading…
Reference in New Issue
Block a user