https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96973

--- Comment #6 from Iain Sandoe <iains at gcc dot gnu.org> ---
(In reply to Francois-Xavier Coudert from comment #4)

from fat.h

FAT headers are always written bigendian

 * at least there's no statement revoking that in the section on FAT64
 * it doesn't seem that the FAT64 format is considered stable yet - so we might
need to experiment,

There's no statement that says the FAT64
>        if (is_64)
> -       memcpy (&fat_arch,
> -               (const char *) arch_view.data + i * arch_size,
> -               arch_size);
> +       {
> +         memcpy (&fat_arch,
> +                 (const char *) arch_view.data + i * arch_size,
> +                 arch_size);
> +         if (swapped)
> +           fat_arch.offset = __builtin_bswap64 (fat_arch.offset);
> +       }
>        else
>         {
>           struct macho_fat_arch fat_arch_32;
> @@ -809,7 +813,10 @@ macho_add_fat (struct backtrace_state *state, const
> char *filename,
>                   arch_size);
>           fat_arch.cputype = fat_arch_32.cputype;
>           fat_arch.cpusubtype = fat_arch_32.cpusubtype;
> -         fat_arch.offset = (uint64_t) fat_arch_32.offset;
> +         if (swapped)
> +           fat_arch.offset = (uint64_t)
> __builtin_bswap32(fat_arch_32.offset);
> +         else
> +           fat_arch.offset = (uint64_t) fat_arch_32.offset;

So in the case of 32b FAT entries...

We also need to swap any other items we use (and before promoting to 64b in the
case of the size.)

>           fat_arch.size = (uint64_t) fat_arch_32.size;
>           fat_arch.align = fat_arch_32.align;
>           fat_arch.reserved = 0;

Reply via email to