macho gas support

Iain Sandoe iain@sandoe.co.uk
Thu May 28 11:01:07 GMT 2026


Hi Alan,

> On 26 May 2026, at 03:31, Alan Modra <amodra@gmail.com> wrote:
> 
> On Mon, May 25, 2026 at 10:46:11AM +0100, Iain Sandoe wrote:
>> I will try to look at and test this - over the next week or two - is
>> there a branch somewhere I can checkout?
> 
> Thanks!  I hadn't put them on a branch, but they are now on
> binutils-gdb users/amodra/macho.

OK ..  so I worked on darwin17 which is the last OS version to support native 32b officially (albeit deprecated).

I built bfd, binutils and gas as 32b exes, using GCC-10.5 (unfortunately, the system clang does not build binutils on that platform).

$ ./gas/as-new --version
GNU assembler (GNU Binutils) 2.46.50.20260526
…
This assembler was configured for a target of `i686-apple-darwin17’.

I also built current mainline 
so the good news : basically repeat your results - with a couple of minor differences:
-FAIL: i386 opcodes
-FAIL: i386 opcodes (Intel disassembly)
-FAIL: i386 opcodes (w/ suffix)
-FAIL: i386 intel (AT&T disassembly)
-FAIL: i386 intel
-FAIL: i386 sub
-FAIL: Check -madd-bnd-prefix
-FAIL: x86-64 RTM insns
-FAIL: x86-64 RTM insns (Intel disassembly)
-FAIL: Check -madd-bnd-prefix (x86-64)

So that is progression - at least, in the context of the tests as framed.

====

I then did a smoke-test with “hello-world.c” built -O0 -g

Now the not-so-good news is that we are not generating the correct relocations for some section differences:

e.g.
system assembler											as-new
RELOCATION RECORDS FOR [__text]:                                                RELOCATION RECORDS FOR [__text]:
00000027 GENERIC_RELOC_VANILLA _printf                                          00000027 GENERIC_RELOC_VANILLA _printf
00000021 GENERIC_RELOC_LOCAL_SECTDIFF lC1-0xb                                 | 00000021 GENERIC_RELOC_VANILLA lC1
00000017 GENERIC_RELOC_LOCAL_SECTDIFF lC0-0xb                                 | 00000017 GENERIC_RELOC_VANILLA lC0
00000007 GENERIC_RELOC_VANILLA __text                                           00000007 GENERIC_RELOC_VANILLA __text

…..

RELOCATION RECORDS FOR [__eh_frame]:                                            RELOCATION RECORDS FOR [__eh_frame]:
0000004c GENERIC_RELOC_LOCAL_SECTDIFF ___x86.get_pc_thunk.ax-0x100            | 0000004c GENERIC_RELOC_VANILLA __text
00000020 GENERIC_RELOC_LOCAL_SECTDIFF _main-0xd4                              | 00000020 GENERIC_RELOC_VANILLA __text

despite this 
$ dwarfdump --verify hello-gas.o 
----------------------------------------------------------------------
 File: hello-gas.o (i386)
----------------------------------------------------------------------
Verifying Compile Unit Header chain... ok
Verifying .debug_info... ok
Verifying .debug_frame... ok
Verifying .debug_line… ok

—— which is somewhat confusing.

I then tried to do the same with an x86_64 asm (i686-darwin should be able to generate code for x86_64-darwin):

$ ./gas/as-new --64 hello.s -o hello-gas.o
hello.s: Assembler messages:
hello.s:113: Error: cannot represent relocation type BFD_RELOC_64_PCREL

Although one should note that, unlike i686 darwin,  x86_64-darwin dwarf mostly contains file offsets (not relocations) the linker is able to figure out the latter when parsing the dwarf sections.

=====

TBH .. unless there’s something blindingly obvious in my observations above, I wonder if it is worth putting in too much more effort into GAS (I spent ages around the 2.21ish era trying to get powerpc-darwin GAS to work, but that stuff bitrotted very quickly).

I have some local patches that allow a working GDB for not too too old (14, I think), and getting the relocs right could be helpful to both that and binutils - which is the part I use most often on the older systems

thanks again for working on this,
Iain

P.S. I will do an x86_64 build later for completeness sake.




More information about the Binutils mailing list