111 lines
4 KiB
Plaintext
111 lines
4 KiB
Plaintext
|
The osxppc platform
|
||
|
===================
|
||
|
|
||
|
ack -mosxppc ...
|
||
|
|
||
|
This platform produces Mach-o executables for PowerPC Mac OS X. You
|
||
|
can run them from the command line in the Terminal.
|
||
|
|
||
|
You *can't* link to libraries from other compilers. These static
|
||
|
executables don't use the dynamic linker. They don't load Apple's
|
||
|
libraries, so they can't call Carbon or Cocoa.
|
||
|
|
||
|
The executables use BSD system calls to interact with your Mac. Our
|
||
|
libsys provides only a few system calls, enough to run a few demo
|
||
|
programs, but not much else. Check the header files in ../osx/include
|
||
|
for the available system calls.
|
||
|
|
||
|
|
||
|
Bugs
|
||
|
----
|
||
|
|
||
|
ACK didn't run on Mac OS X when this platform was added. The only way
|
||
|
to run ack -mosxppc was as a cross compiler from another operating
|
||
|
system.
|
||
|
|
||
|
ACK doesn't have 64-bit integers, but Mac OS X uses 64-bit integers in
|
||
|
its system calls. Our libsys converts between 32-bit and 64-bit
|
||
|
integers by setting the high bits to zero, or discarding the high
|
||
|
bits. This affects lseek() and stat(). They report the wrong values
|
||
|
for file sizes and offsets beyond 4 gigabytes.
|
||
|
|
||
|
Our PowerPC code generator is new and probably has bugs. Its stack
|
||
|
layout and calling conventions are not compatible with other
|
||
|
compilers. It passes all function arguments on the stack, which is
|
||
|
slower than passing them in registers.
|
||
|
|
||
|
|
||
|
Example
|
||
|
-------
|
||
|
Compile something:
|
||
|
|
||
|
ack -mosxppc -O6 -o paranoia examples/paranoia.c
|
||
|
|
||
|
The executable has a symbol table. If you have Apple's Xcode, try
|
||
|
|
||
|
nm -g paranoia # to list the global symbols
|
||
|
otool -hl paranoia # to check the Mach header and load commands
|
||
|
gdb paranoia # to debug it
|
||
|
|
||
|
Within gdb, commands like "gdb main" and "gdb '.ret'" can disassemble
|
||
|
functions. Backtraces don't work, because our stack layout is not the
|
||
|
same as Apple's.
|
||
|
|
||
|
|
||
|
Other hints
|
||
|
-----------
|
||
|
|
||
|
PowerPC Macs became obsolete after Apple's transition to Intel. Mac
|
||
|
OS X 10.5 Leopard was the last version to run on PowerPC. The older
|
||
|
Mac OS X 10.4 Tiger was the last version to include Classic for
|
||
|
running Mac OS 9 programs. Our ack -mosxppc began to produce
|
||
|
executables in 2016, about 7 years after Apple released Mac OS X 10.6
|
||
|
Snow Leopard for Intel only.
|
||
|
|
||
|
Apple's Xcode included tools like gcc and gdb. It also had manual
|
||
|
pages for some system calls, like getdirentries(2). Some system calls
|
||
|
are like FreeBSD, some are unique to OS X. If you want to learn how
|
||
|
to call write(2) or sigaction(2), then a manual page from another BSD
|
||
|
or Linux might be enough.
|
||
|
|
||
|
Xcode 2.5 was the last version to run on Tiger. The "Xcode 2.5
|
||
|
Developer Tools" were a 902.9 MB download from Apple. As of 2016, the
|
||
|
download required an Apple ID and was available at:
|
||
|
|
||
|
https://developer.apple.com/download/more/
|
||
|
|
||
|
Older versions of Xcode came with Mac OS X. If your version of OS X
|
||
|
came with your Mac, /Applications/Installers might contain an Xcode
|
||
|
installer. If you upgraded OS X, your install DVD might have Xcode.
|
||
|
|
||
|
The source code at https://opensource.apple.com/ might reveal more
|
||
|
about system calls. For 10.4.11.ppc, the kernel is in xnu-792.24.17,
|
||
|
and Libc is in Libc-391.2.10. These files might help:
|
||
|
|
||
|
xnu*/bsd/kern/syscalls.master
|
||
|
master list of BSD system calls
|
||
|
xnu*/osfmk/kern/syscall_sw.c
|
||
|
master list of Mach traps
|
||
|
xnu*/bsd/kern/mach_loader.c
|
||
|
details about loading Mach-o executables
|
||
|
xnu*/bsd/dev/ppc/unix_signal.c
|
||
|
details about sending signals to processes
|
||
|
xnu*/bsd/sys/*.h
|
||
|
headers that Xcode installs as /usr/include/sys/*.h
|
||
|
xnu*/bsd/man/man2/*.2
|
||
|
manual pages that Xcode installs as /usr/share/man/man2/*.2
|
||
|
Libc*/ppc/sys/SYS.h
|
||
|
Libc*/ppc/sys/*.s
|
||
|
assembly code (in gas syntax) for making system calls
|
||
|
|
||
|
The 10.4.11.ppc sources are wrong for Intel; use 10.4.11.x86 or 10.5
|
||
|
or newer. 10.5 moved SYS.h to xnu*/libsyscall/custom/SYS.h
|
||
|
|
||
|
The kernel maps a common page into every process, and Apple's Libc
|
||
|
uses the common page to speed up system calls like gettimeofday(2).
|
||
|
Our libsys does not use the common page.
|
||
|
|
||
|
|
||
|
George Koehler <xkernigh@netscape.net>
|
||
|
2016-12-03
|