aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xconfigure98
-rw-r--r--lib/jump-dis.c4
-rwxr-xr-xscript/gen-inject-asm.sh19
-rw-r--r--script/mconfig.py15
4 files changed, 108 insertions, 28 deletions
diff --git a/configure b/configure
index cfc2f70..61ebf00 100755
--- a/configure
+++ b/configure
@@ -1,5 +1,5 @@
#!/usr/bin/env python
-import sys, os
+import sys, os, glob
sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), 'script'))
import mconfig
settings = mconfig.settings_root
@@ -12,6 +12,7 @@ c.dsymutil.required()
settings.add_setting_option('imaon2', '--with-imaon2', 'path to imaon2 (optional)', '')
settings.add_setting_option('gen_dia', '--enable-recompile-dia', 'generate darwin-inject-asm.S', False, bool=True)
+settings.add_setting_option('enable_tests', '--enable-tests', 'tests!', False, bool=True)
asm_archs = [
('x86_64', []),
@@ -20,6 +21,8 @@ asm_archs = [
('arm64', []), # XXX
]
+asm_cflags = ['-Os', '-fno-stack-protector', '-isysroot', '/dev/null', '-fPIC']
+asm_ldflags = ['-nostartfiles', '-nodefaultlibs']
machs = []
for name, cflags in asm_archs:
mach = mconfig.Machine('asm-' + name, settings, 'for cross-compiling the inject baton', name + '-apple-darwin10')
@@ -30,7 +33,8 @@ for name, cflags in asm_archs:
if settings.gen_dia:
cc.argv()
mach_settings = settings[mach.name]
- mach_settings.cflags = cflags + mach_settings.cflags
+ mach_settings.cflags = cflags + asm_cflags + mach_settings.cflags
+ mach_settings.ldflags = asm_ldflags + mach_settings.ldflags
mconfig.post_parse_args_will_need.append(f)
@@ -38,13 +42,11 @@ mconfig.parse_args()
####################################
mconfig.mark_safe_to_clean('(src)/generated/darwin-inject-asm.S', settings)
-settings.host.cflags = ['-I%s/lib' % (settings.src,)] + settings.host.cflags
settings.host.debug_info = True
+settings.c_includes = ['(src)/lib', '(src)/substrate']
emitter = settings.emitter
-balco = lambda *args, **kwargs: mconfig.build_and_link_c_objs(emitter, settings.host_machine(), settings, *args, **kwargs)
-
def cb(fn):
if fn.endswith('/objc.c'):
return settings.specialize(obj_ldflag_sets=[('-lobjc',)])
@@ -59,7 +61,8 @@ def cb(fn):
# (This only matters on 32-bit ARM, and the text segment is currently 0xa000
# bytes there, more than enough.)
-balco(
+mconfig.build_and_link_c_objs(
+ emitter, settings.host_machine(), settings,
'dylib',
'(out)/libsubstitute.dylib',
[
@@ -82,8 +85,13 @@ balco(
)
#settings.test = 'foo baz'
+def o_to_bin(exe):
+ bin = os.path.splitext(exe)[0] + '.bin'
+ emitter.add_command(settings, [bin], [exe], ['segedit -extract __TEXT __text (outs[0]) (ins[0])'])
+ return bin
+
if settings.gen_dia:
- bins = []
+ args = []
for (name, _cflags), mach in zip(asm_archs, machs):
exe = '(out)/inject-asm-raw-%s' % (name,)
bin = exe + '.bin'
@@ -92,15 +100,77 @@ if settings.gen_dia:
override_obj_fn='(out)/inject-asm-raw-%s.o' % (name,),
override_ldflags=['-Wl,-order_file,(src)/lib/darwin/inject-asm-raw.order'] + settings[mach.name].ldflags,
),
- 'exec',
+ 'dylib',
exe,
['(src)/lib/darwin/inject-asm-raw.c'])
- bins.append(bin)
- emitter.add_command(settings, [bin], [exe], ['segedit -extract __TEXT __text (outs[0]) (ins[0])'])
- emitter.add_command(settings, ['(src)/generated/darwin-inject-asm.S'], bins, [['(src)/script/gen-inject-asm.sh', '(out)'] + bins])
-
-emitter.add_command(settings, ['all'], ['(out)/libsubstitute.dylib'], [], phony=True)
+ bin = o_to_bin(exe)
+ args.extend([name, bin])
+ emitter.add_command(settings, ['(src)/generated/darwin-inject-asm.S'], ['(src)/script/gen-inject-asm.sh'] + args[1::2], [['(src)/script/gen-inject-asm.sh', '(outs[0])'] + args])
+
+all_deps = ['(out)/libsubstitute.dylib']
+
+if settings.enable_tests:
+ # just for quick testing
+ for ofile, sfile, cflags, mach in [
+ ('insns-arm.o', 'insns-arm.S', [], machs[2]),
+ ('insns-thumb2.o', 'insns-arm.S', ['-DTHUMB2'], machs[2]),
+ ('insns-libz-arm.o', 'insns-libz-arm.S', [], machs[2]),
+ ('insns-libz-thumb2.o', 'insns-libz-arm.S', ['-DTHUMB2'], machs[2]),
+ ('transform-dis-cases-arm64.o', 'transform-dis-cases-arm64.S', [], machs[3]),
+ ('transform-dis-cases-i386.o', 'transform-dis-cases-i386.S', [], machs[1]),
+ ('transform-dis-cases-x86_64.o', 'transform-dis-cases-x86_64.S', [], machs[0]),
+ ]:
+ mconfig.build_c_objs(emitter, mach, settings.specialize(override_obj_fn='(out)/'+ofile), ['(src)/test/'+sfile])
+ all_deps.append(o_to_bin('(out)/'+ofile))
+
+ tests = [
+ ('find-syms', ['-std=c89']),
+ ('find-syms-cpp', 'find-syms', ['-x', 'c++', '-std=c++98'], {'cpp': True}),
+ ('substrate', ['-x', 'c++', '-std=c++98'], {'cpp': True}),
+ ('imp-forwarding', [], ['-framework', 'Foundation', '-lobjc']),
+ ('objc-hook', [], ['-framework', 'Foundation']),
+ ('interpose',),
+ ('inject', {'extra_objs': ['(out)/lib/darwin/inject.o', '(out)/lib/darwin/read.o']}),
+ ('pc-patch', {'extra_objs': ['(out)/lib/darwin/execmem.o']}),
+ ('execmem', [], ['-segprot', '__TEST', 'rwx', 'rx'], {'extra_objs': ['(out)/lib/darwin/execmem.o']}),
+ ('hook-functions', [], ['-segprot', '__TEST', 'rwx', 'rx']),
+ ('posixspawn-hook',),
+ ('htab',),
+ ('vec', {'cpp': True, 'extra_objs': ['(out)/lib/cbit/vec.o']}),
+ ]
+
+ for arch, hdr, xdis, target in [
+ ('arm', 'arm/dis-arm.inc.h', 'dis_arm', 'arm'),
+ ('thumb', 'arm/dis-thumb.inc.h', 'dis_thumb', 'arm'),
+ ('thumb2', 'arm/dis-thumb2.inc.h', 'dis_thumb2', 'arm'),
+ ('arm64', 'arm64/dis-main.inc.h', 'dis', 'arm64'),
+ ('i386', 'x86/dis-main.inc.h', 'dis', 'i386'),
+ ('x86_64', 'x86/dis-main.inc.h', 'dis', 'x86_64')
+ ]:
+ tests.append(('td-simple-'+arch, 'td-simple', ['-DHDR="%s"' % (hdr,), '-Dxdis='+xdis, '-DFORCE_TARGET_'+target]))
+ tests.append(('jump-dis-'+arch, 'jump-dis', ['-O0', '-DFORCE_TARGET_'+target], {'extra_objs': ['(out)/lib/cbit/vec.o']}))
+ tests.append(('transform-dis-'+arch, 'transform-dis', ['-O0', '-DFORCE_TARGET_'+target], {'extra_objs': ['(out)/lib/cbit/vec.o']}))
+
+ for tup in tests:
+ tup = list(tup)
+ ibase = obase = tup.pop(0)
+ cflags = ldflags = []
+ options = {}
+ if tup and isinstance(tup[0], basestring): ibase = tup.pop(0)
+ if tup and isinstance(tup[0], (list, tuple)): cflags = tup.pop(0)
+ if tup and isinstance(tup[0], (list, tuple)): ldflags = tup.pop(0)
+ if tup: options, = tup
+ o = '(out)/test-'+obase
+ cfile = glob.glob(settings.src+'/test/test-'+ibase+'.*')[0]
+ mconfig.build_and_link_c_objs(emitter, settings.host_machine(), settings.specialize(
+ override_cflags=cflags+settings.host.cflags,
+ override_ldflags=ldflags+['-L(out)', '-lsubstitute']+settings.host.ldflags,
+ override_obj_fn=o+'.o',
+ override_is_cxx=options.get('cxx', False),
+ ), 'exec', o, [cfile], objs=options.get('extra_objs', []))
+ all_deps.append(o)
+
+emitter.add_command(settings, ['all'], all_deps, [], phony=True)
emitter.set_default_rule('all')
-
mconfig.finish_and_emit()
diff --git a/lib/jump-dis.c b/lib/jump-dis.c
index 13845f5..f909cc7 100644
--- a/lib/jump-dis.c
+++ b/lib/jump-dis.c
@@ -140,7 +140,11 @@ bool jump_dis_main(void *code_ptr, uint_tptr pc_patch_start, uint_tptr pc_patch_
#ifdef JUMP_DIS_VERBOSE
printf("jump-dis: pc=%llx op=%08x size=%x bad=%d continue_after=%d\n",
(unsigned long long) ctx.base.pc,
+#if defined(TARGET_x86_64) || defined(TARGET_i386)
+ 0,
+#else
ctx.base.op,
+#endif
ctx.base.op_size,
ctx.bad_insn,
ctx.continue_after_this_insn);
diff --git a/script/gen-inject-asm.sh b/script/gen-inject-asm.sh
index 161bbe7..633a1a5 100755
--- a/script/gen-inject-asm.sh
+++ b/script/gen-inject-asm.sh
@@ -1,5 +1,7 @@
#!/bin/sh
-cat <<END
+outfile="$1"
+shift
+(cat <<END
/* Generated by script/gen-inject-asm.sh. The relevant source is in-tree (make
* out/darwin-inject-asm.S), but this file has been checked in too, in case
* your C compiler doesn't support all of these architectures.
@@ -13,12 +15,11 @@ cat <<END
.globl _inject_page_start
_inject_page_start:
END
-outfile="$1"
-shift
-(for fn in "$@"; do
- echo ".align 2"
- echo ".globl _inject_start_$i"
- echo "_inject_start_$i:"
- printf ".byte "
- xxd -i < "$fn" | xargs echo
+while [ -n "$1" ]; do
+ echo ".align 2"
+ echo ".globl _inject_start_$1"
+ echo "_inject_start_$1:"
+ printf ".byte "
+ xxd -i < "$2" | xargs echo
+ shift 2
done) > "$outfile"
diff --git a/script/mconfig.py b/script/mconfig.py
index f056c10..e009675 100644
--- a/script/mconfig.py
+++ b/script/mconfig.py
@@ -30,7 +30,7 @@ def to_upper_and_underscore(s):
def argv_to_shell(argv):
quoteds = []
for arg in argv:
- if re.match('^[a-zA-Z0-9_\.@/+=-]+$', arg):
+ if re.match('^[a-zA-Z0-9_\.@/+=,-]+$', arg):
quoteds.append(arg)
else:
quoted = ''
@@ -1071,7 +1071,7 @@ def build_c_objs(emitter, machine, settings, sources, headers=[], settings_cb=No
my_settings = s
obj_fn = get_else_and(my_settings, 'override_obj_fn', lambda: guess_obj_fn(fn, settings), _expand)
is_cxx = get_else_and(my_settings, 'override_is_cxx', lambda: default_is_cxx(fn))
- includes = list(map(_expand, my_settings.get('c_includes', [])))
+ include_args = ['-I'+_expand(inc) for inc in my_settings.c_includes]
mach_settings = my_settings[machine.name]
dbg = ['-g'] if mach_settings.debug_info else []
cflags = _expand_argv(get_else_and(my_settings, 'override_cflags', lambda: (mach_settings.cxxflags if is_cxx else mach_settings.cflags)))
@@ -1081,9 +1081,11 @@ def build_c_objs(emitter, machine, settings, sources, headers=[], settings_cb=No
dep_fn = os.path.splitext(obj_fn)[0] + '.d'
mkdir_cmd = ['mkdir', '-p', dirname(obj_fn)]
- cmd = cc + dbg + cflags + ['-c', '-o', obj_fn, '-MMD', '-MF', dep_fn, fn]
+ cmd = cc + dbg + include_args + cflags + ['-c', '-o', obj_fn, '-MMD', '-MF', dep_fn, fn]
- emitter.add_command(my_settings, [obj_fn], [fn] + extra_deps, [mkdir_cmd, cmd], depfile=('makefile', dep_fn), expand=False)
+ cmds = [mkdir_cmd, cmd]
+ cmds = settings.get('modify_compile_commands', lambda x: x)(cmds)
+ emitter.add_command(my_settings, [obj_fn], [fn] + extra_deps, cmds, depfile=('makefile', dep_fn), expand=False)
for lset in my_settings.get('obj_ldflag_sets', ()):
ldflag_sets.add(tuple(lset))
@@ -1103,7 +1105,7 @@ def link_c_objs(emitter, machine, settings, link_type, link_out, objs, link_with
assert link_type in ('exec', 'dylib', 'staticlib', 'obj')
if link_type in ('exec', 'dylib'):
assert link_with_cxx in (False, True)
- cc_for_link = (tools.cxx if link_with_cxx else tools.cc).argv()
+ cc_for_link = _expand_argv(get_else_and(settings, 'override_ld', lambda: (tools.cxx if link_with_cxx else tools.cc).argv()))
if link_type == 'dylib':
typeflag = ['-dynamiclib'] if machine.is_darwin() else ['-shared']
else:
@@ -1118,6 +1120,7 @@ def link_c_objs(emitter, machine, settings, link_type, link_out, objs, link_with
elif link_type == 'obj':
cmds = [tools.cc.argv() + ['-Wl,-r', '-nostdlib', '-o', link_out] + objs]
cmds.insert(0, ['mkdir', '-p', dirname(link_out)])
+ cmds = settings.get('modify_link_commands', lambda x: x)(cmds)
emitter.add_command(settings, [link_out], objs + extra_deps, cmds, expand=False)
def build_and_link_c_objs(emitter, machine, settings, link_type, link_out, sources, headers=[], objs=[], settings_cb=None, force_cli=False, expand=True, extra_deps=[], extra_ldflags=[]):
@@ -1167,6 +1170,8 @@ settings_root.allow_autoclean_outside_out = False
post_parse_args_will_need.append(check_rule_hashes)
settings_root.auto_rerun_config = True
+settings_root.c_includes = []
+
emitters = {
'makefile': MakefileEmitter,
'ninja': NinjaEmitter,