PR27567, Linking PE files adds alignment section flags to executables
So don't set those flags for an executable. In the patch I also test DYNAMIC even though the PE bfd code doesn't appear to set it for dlls. I figure it doesn't hurt to include that flag too. PR 27567 bfd/ * coffcode.h (styp_to_sec_flags): Use an unsigned long styp_flags. (coff_write_object_contents): Pass bfd to COFF_ENCODE_ALIGNMENT, ignore alignment checks when return is false. Formatting. include/ * coff/internal.h (struct internal_scnhdr): Make s_flags unsigned long. * coff/pe.h (COFF_ENCODE_ALIGNMENT): Don't set align flags for an executable and return false. Do so for a relocatable object and evaluate to true. * coff/ti.h (COFF_ENCODE_ALIGNMENT): Add bfd arg and evaluate to true. (COFF_DECODE_ALIGNMENT): Formatting. * coff/z80.h (COFF_ENCODE_ALIGNMENT): Similarly. (COFF_DECODE_ALIGNMENT): Similarly.
This commit is contained in:
parent
768589d180
commit
6f8f6017a0
7 changed files with 40 additions and 16 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2021-04-16 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
PR 27567
|
||||||
|
* coffcode.h (styp_to_sec_flags): Use an unsigned long styp_flags.
|
||||||
|
(coff_write_object_contents): Pass bfd to COFF_ENCODE_ALIGNMENT,
|
||||||
|
ignore alignment checks when return is false. Formatting.
|
||||||
|
|
||||||
2021-04-15 Nelson Chu <nelson.chu@sifive.com>
|
2021-04-15 Nelson Chu <nelson.chu@sifive.com>
|
||||||
|
|
||||||
PR27584
|
PR27584
|
||||||
|
|
|
@ -737,7 +737,7 @@ styp_to_sec_flags (bfd *abfd,
|
||||||
flagword *flags_ptr)
|
flagword *flags_ptr)
|
||||||
{
|
{
|
||||||
struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
|
struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
|
||||||
long styp_flags = internal_s->s_flags;
|
unsigned long styp_flags = internal_s->s_flags;
|
||||||
flagword sec_flags = 0;
|
flagword sec_flags = 0;
|
||||||
|
|
||||||
#ifdef STYP_BLOCK
|
#ifdef STYP_BLOCK
|
||||||
|
@ -3643,18 +3643,18 @@ coff_write_object_contents (bfd * abfd)
|
||||||
|
|
||||||
|
|
||||||
#ifdef COFF_ENCODE_ALIGNMENT
|
#ifdef COFF_ENCODE_ALIGNMENT
|
||||||
COFF_ENCODE_ALIGNMENT(section, current->alignment_power);
|
if (COFF_ENCODE_ALIGNMENT (abfd, section, current->alignment_power)
|
||||||
if ((unsigned int)COFF_DECODE_ALIGNMENT(section.s_flags)
|
&& (COFF_DECODE_ALIGNMENT (section.s_flags)
|
||||||
!= current->alignment_power)
|
!= current->alignment_power))
|
||||||
{
|
{
|
||||||
bool warn = coff_data (abfd)->link_info
|
bool warn = (coff_data (abfd)->link_info
|
||||||
&& !bfd_link_relocatable (coff_data (abfd)->link_info);
|
&& !bfd_link_relocatable (coff_data (abfd)->link_info));
|
||||||
|
|
||||||
_bfd_error_handler
|
_bfd_error_handler
|
||||||
/* xgettext:c-format */
|
/* xgettext:c-format */
|
||||||
(_("%pB:%s section %s: alignment 2**%u not representable"),
|
(_("%pB:%s section %s: alignment 2**%u not representable"),
|
||||||
abfd, warn ? " warning:" : "", current->name,
|
abfd, warn ? " warning:" : "", current->name,
|
||||||
current->alignment_power);
|
current->alignment_power);
|
||||||
if (!warn)
|
if (!warn)
|
||||||
{
|
{
|
||||||
bfd_set_error (bfd_error_nonrepresentable_section);
|
bfd_set_error (bfd_error_nonrepresentable_section);
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
2021-04-16 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
PR 27567
|
||||||
|
* coff/internal.h (struct internal_scnhdr): Make s_flags unsigned long.
|
||||||
|
* coff/pe.h (COFF_ENCODE_ALIGNMENT): Don't set align flags for an
|
||||||
|
executable and return false. Do so for a relocatable object and
|
||||||
|
evaluate to true.
|
||||||
|
* coff/ti.h (COFF_ENCODE_ALIGNMENT): Add bfd arg and evaluate to true.
|
||||||
|
(COFF_DECODE_ALIGNMENT): Formatting.
|
||||||
|
* coff/z80.h (COFF_ENCODE_ALIGNMENT): Similarly.
|
||||||
|
(COFF_DECODE_ALIGNMENT): Similarly.
|
||||||
|
|
||||||
2021-04-09 Alan Modra <amodra@gmail.com>
|
2021-04-09 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* dis-asm.h (struct disassemble_info): Add dynrelbuf and dynrelcount.
|
* dis-asm.h (struct disassemble_info): Add dynrelbuf and dynrelcount.
|
||||||
|
|
|
@ -407,7 +407,7 @@ struct internal_scnhdr
|
||||||
bfd_vma s_lnnoptr; /* file ptr to line numbers */
|
bfd_vma s_lnnoptr; /* file ptr to line numbers */
|
||||||
unsigned long s_nreloc; /* number of relocation entries */
|
unsigned long s_nreloc; /* number of relocation entries */
|
||||||
unsigned long s_nlnno; /* number of line number entries*/
|
unsigned long s_nlnno; /* number of line number entries*/
|
||||||
long s_flags; /* flags */
|
unsigned long s_flags; /* flags */
|
||||||
unsigned char s_page; /* TI COFF load page */
|
unsigned char s_page; /* TI COFF load page */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -105,9 +105,12 @@
|
||||||
#define IMAGE_SCN_ALIGN_8192BYTES IMAGE_SCN_ALIGN_POWER_CONST (13)
|
#define IMAGE_SCN_ALIGN_8192BYTES IMAGE_SCN_ALIGN_POWER_CONST (13)
|
||||||
|
|
||||||
/* Encode alignment power into IMAGE_SCN_ALIGN bits of s_flags. */
|
/* Encode alignment power into IMAGE_SCN_ALIGN bits of s_flags. */
|
||||||
#define COFF_ENCODE_ALIGNMENT(SECTION, ALIGNMENT_POWER) \
|
#define COFF_ENCODE_ALIGNMENT(ABFD, SECTION, ALIGNMENT_POWER) \
|
||||||
((SECTION).s_flags |= IMAGE_SCN_ALIGN_POWER_CONST ((ALIGNMENT_POWER) <= 13 \
|
(((ABFD)->flags & (EXEC_P | DYNAMIC)) != 0 ? false \
|
||||||
? (ALIGNMENT_POWER) : 13))
|
: ((SECTION).s_flags \
|
||||||
|
|= IMAGE_SCN_ALIGN_POWER_CONST ((ALIGNMENT_POWER) < 13 \
|
||||||
|
? (ALIGNMENT_POWER) : 13), \
|
||||||
|
true))
|
||||||
#define COFF_DECODE_ALIGNMENT(X) \
|
#define COFF_DECODE_ALIGNMENT(X) \
|
||||||
IMAGE_SCN_ALIGN_POWER_NUM ((X) & IMAGE_SCN_ALIGN_POWER_BIT_MASK)
|
IMAGE_SCN_ALIGN_POWER_NUM ((X) & IMAGE_SCN_ALIGN_POWER_BIT_MASK)
|
||||||
|
|
||||||
|
|
|
@ -88,9 +88,10 @@ struct external_filehdr
|
||||||
#define COFF_ALIGN_IN_SECTION_HEADER 1
|
#define COFF_ALIGN_IN_SECTION_HEADER 1
|
||||||
#define COFF_ALIGN_IN_S_FLAGS 1
|
#define COFF_ALIGN_IN_S_FLAGS 1
|
||||||
/* requires a power-of-two argument */
|
/* requires a power-of-two argument */
|
||||||
#define COFF_ENCODE_ALIGNMENT(S,X) ((S).s_flags |= (((unsigned)(X)&0xF)<<8))
|
#define COFF_ENCODE_ALIGNMENT(B,S,X) \
|
||||||
|
((S).s_flags |= (((unsigned) (X) & 0xF) << 8), true)
|
||||||
/* result is a power of two */
|
/* result is a power of two */
|
||||||
#define COFF_DECODE_ALIGNMENT(X) (((X)>>8)&0xF)
|
#define COFF_DECODE_ALIGNMENT(X) (((X) >> 8) & 0xF)
|
||||||
|
|
||||||
#define COFF0_P(ABFD) (bfd_coff_filhsz(ABFD) == FILHSZ_V0)
|
#define COFF0_P(ABFD) (bfd_coff_filhsz(ABFD) == FILHSZ_V0)
|
||||||
#define COFF2_P(ABFD) (bfd_coff_scnhsz(ABFD) != SCNHSZ_V01)
|
#define COFF2_P(ABFD) (bfd_coff_scnhsz(ABFD) != SCNHSZ_V01)
|
||||||
|
|
|
@ -35,9 +35,10 @@
|
||||||
#define COFF_ALIGN_IN_S_FLAGS 1
|
#define COFF_ALIGN_IN_S_FLAGS 1
|
||||||
#define F_ALGNMASK 0x0F00
|
#define F_ALGNMASK 0x0F00
|
||||||
/* requires a power-of-two argument */
|
/* requires a power-of-two argument */
|
||||||
#define COFF_ENCODE_ALIGNMENT(S,X) ((S).s_flags |= (((unsigned)(X)&0xF)<<8))
|
#define COFF_ENCODE_ALIGNMENT(B,S,X) \
|
||||||
|
((S).s_flags |= (((unsigned) (X) & 0xF) << 8), true)
|
||||||
/* result is a power of two */
|
/* result is a power of two */
|
||||||
#define COFF_DECODE_ALIGNMENT(X) (((X)>>8)&0xF)
|
#define COFF_DECODE_ALIGNMENT(X) (((X) >> 8) & 0xF)
|
||||||
|
|
||||||
#define Z80MAGIC 0x805A
|
#define Z80MAGIC 0x805A
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue