/
README
116 lines (85 loc) · 2.68 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
This is a userland Mach-O loader for linux.
* Usage
% make release
% ./ld-mac mac_binary [options...]
You need OpenCFLite (http://sourceforge.net/projects/opencflite/)
installed if you want to run some programs such as dsymutil.
opencflite-476.17.2 is recommended.
* How to use compiler tool chains of Xcode
Get xcode_3.2.6_and_ios_sdk_4.3__final.dmg (or another xcode package).
% git clone git@github.com:shinh/maloader.git
% ./maloader/unpack_xcode.sh xcode_3.2.6_and_ios_sdk_4.3__final.dmg
% sudo cp -a xcode_3.2.6_and_ios_sdk_4.3__final/root /usr/i686-apple-darwin10
% cd maloader
% make release
% ./ld-mac /usr/i686-apple-darwin10/usr/bin/gcc mach/hello.c
% ./ld-mac a.out
* How to run Mach-O binaries using binfmt_misc
% ./binfmt_misc.sh
% /usr/i686-apple-darwin10/usr/bin/gcc mach/hello.c
% ./a.out
To remove the entries, run the following command:
% ./binfmt_misc.sh stop
* How to try 32bit support
% make clean
% make all BITS=32
If you see permission errors like
ld-mac: ./mach/hello.c.bin mmap(file) failed: Operation not permitted
you should run the following command to allow users to mmap files to
addresses less than 0x10000.
% sudo sh -c 'echo 4096 > /proc/sys/vm/mmap_min_addr'
Or, running ld-mac as a super user would also work.
* How to run both 64bit Mach-O and 32bit Mach-O binaries
% make both
% ./binfmt_misc.sh start `pwd`/ld-mac.sh
% /usr/i686-apple-darwin10/usr/bin/gcc -arch i386 mach/hello.c -o hello32
% /usr/i686-apple-darwin10/usr/bin/gcc -arch x86_64 mach/hello.c -o hello64
% /usr/i686-apple-darwin10/usr/bin/gcc -arch i386 -arch x86_64 mach/hello.c -o hello
% ./hello32
Hello, 32bit world!
% ./hello64
Hello, 64bit world!
% ./hello
Hello, 64bit world!
% LD_MAC_BITS=32 ./hello
Hello, 32bit world!
* Which programs should work
OK
- gcc-4.2 (link with -g requires OpenCFLite)
- otool
- nm
- dyldinfo
- dwarfdump
- strip
- size
- dsymutil (need OpenCFLite)
- cpp-4.2
- clang
-- clang-70 (xcode 3.2.6): OK, but linking wasn't checked due to lack of sysroot
-- clang-137 (xcode 4.0): OK
not OK
- ld in xcode4
- llvm-gcc
- gnumake and bsdmake
- lex and flex
- ar
- m4
- gdb
- libtool
- nasm and ndisasm (i386)
- mpicc, mpicxx, and mpic++
* Notice
- Running all Mac binaries isn't my goal. Only command line tools such
as compiler tool chain can be executed by this loader.
- A slide about this: http://shinh.skr.jp/slide/ldmac/000.html
* TODO
- read dwarf for better backtracing
- make llvm-gcc work
- make ld in xcode4 work
- improve 32bit support
- handle dwarf and C++ exception
* License
Simplified BSD License.
Note that all files in "include" directory and some files in "libmac"
were copied from Apple's Libc-594.9.1.
http://www.opensource.apple.com/release/mac-os-x-1064/