Opcodes 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +2 -0
- data/LICENSE +674 -0
- data/LICENSE.README +8 -0
- data/README +88 -0
- data/examples/bfd_section.rb +34 -0
- data/examples/bfd_symbol.rb +34 -0
- data/examples/list_architectures.rb +10 -0
- data/examples/x86_bytestring.rb +43 -0
- data/lib/Opcodes.rb +53 -0
- data/module/Arch.c +364 -0
- data/module/Arch.h +37 -0
- data/module/Opcodes.c +473 -0
- data/module/Opcodes.h +46 -0
- data/module/extconf.rb +65 -0
- data/module/rdoc_input/Opcodes.rb +137 -0
- data/module/ruby_compat.c +72 -0
- data/module/ruby_compat.h +25 -0
- data/tests/ut_opcodes.rb +37 -0
- data/tests/ut_opcodes_bfd.rb +556 -0
- metadata +74 -0
data/LICENSE.README
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
The Opcodes Ruby extension is released under the GNU Public License version 3.0,
|
2
|
+
distributed in this package as LICENSE.
|
3
|
+
|
4
|
+
The intent of this license choice is not to restrict distribution, but for
|
5
|
+
compatibility with the distribution terms of opdis and GNU binutils.
|
6
|
+
|
7
|
+
Contact community@thoughtgang.org for alternative licensing arrangements if
|
8
|
+
the GPLv3 is too restrictive.
|
data/README
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
Opcodes
|
2
|
+
|
3
|
+
A Ruby C extension (and gem) for the GNU Binutils libopcodes library.
|
4
|
+
|
5
|
+
BUILD
|
6
|
+
-----
|
7
|
+
|
8
|
+
The standard C extension build process is used:
|
9
|
+
|
10
|
+
bash# ruby extconf.rb
|
11
|
+
bash# make
|
12
|
+
|
13
|
+
Note that the Ruby headers must be installed. On Ubuntu, these are in the
|
14
|
+
ruby-dev or ruby1.9-dev package.
|
15
|
+
|
16
|
+
|
17
|
+
The gem is built using the standard gem build command:
|
18
|
+
|
19
|
+
bash# gem build Opcodes.gemspec
|
20
|
+
|
21
|
+
|
22
|
+
The top-level Makefile supports each of these builds with the commands
|
23
|
+
'make' and 'make gem'.
|
24
|
+
|
25
|
+
bash# make
|
26
|
+
# builds C extension
|
27
|
+
bash# make gem
|
28
|
+
# builds the gem
|
29
|
+
|
30
|
+
|
31
|
+
BINUTILS AND SUPPORTED ARCHITECTURES
|
32
|
+
------------------------------------
|
33
|
+
|
34
|
+
The implementation of binutils (and libopcodes) does not provide a way to
|
35
|
+
determine the supported platforms at compile time, unless the config.h file
|
36
|
+
used to build the binutils package is present.
|
37
|
+
|
38
|
+
The extconf.rb file has been modified in order to detect the architectures
|
39
|
+
supported by the local copy of binutils, and to allow the user to specify
|
40
|
+
which architectures they want supported.
|
41
|
+
|
42
|
+
It does this using the following steps:
|
43
|
+
|
44
|
+
1. run objdump -i to get the supported architectures
|
45
|
+
2. each line that matches one of binutils' known architectures is
|
46
|
+
added as a #define to CPPFLAGS
|
47
|
+
3. if no architectures have been found, or if objdump failed to run,
|
48
|
+
default to the i386 architecture.
|
49
|
+
|
50
|
+
The binary used in step 1 can be specified by the user via the --with-objdump
|
51
|
+
flag. For example:
|
52
|
+
|
53
|
+
bash# cat /tmp/objdump.sh
|
54
|
+
#/bin/sh
|
55
|
+
echo 'arm'
|
56
|
+
echo 'sparc'
|
57
|
+
echo 'm68k'
|
58
|
+
bash# ruby1.9 extconf.rb --with-objdump=/tmp/objdump.sh
|
59
|
+
checking for init_disassemble_info() in -lopcodes... yes
|
60
|
+
Adding architecture 'arm'
|
61
|
+
Adding architecture 'sparc'
|
62
|
+
Adding architecture 'm68k'
|
63
|
+
creating Makefile
|
64
|
+
|
65
|
+
This makes it possible to force compilation of support for specific
|
66
|
+
architectures when there is no working objdump present. Note that libopcodes
|
67
|
+
must have been compiled with support for the architectures, or you will get
|
68
|
+
runtime errors.
|
69
|
+
|
70
|
+
|
71
|
+
EXAMPLES
|
72
|
+
|
73
|
+
Extended examples are provided in the 'examples' directory. The following
|
74
|
+
code snippets give a brief overview of using the BFD and Opcodes extensions
|
75
|
+
together.
|
76
|
+
|
77
|
+
require 'BFD'
|
78
|
+
t = Bfd::Target.new('/tmp/a.out')
|
79
|
+
|
80
|
+
require 'Opcodes'
|
81
|
+
o = Opcodes::Disassembler.new( :bfd => t, :arch => 'x86' )
|
82
|
+
o.disasm_insn( t.sections['.text'].contents, :vma => 0 )
|
83
|
+
|
84
|
+
|
85
|
+
o = Opcodes::Disassembler.new( :bfd => t )
|
86
|
+
o.disasm_insn( t.sections['.text'].contents, :vma => 0 )
|
87
|
+
|
88
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Disassemble BFD Section
|
3
|
+
# Copyright 2010 Thoughtgang <http://www.thoughtgang.org>
|
4
|
+
|
5
|
+
require 'BFD'
|
6
|
+
require 'Opcodes'
|
7
|
+
|
8
|
+
def print_insn( insn )
|
9
|
+
puts "%08X\t%s" % [ insn[:vma], insn[:insn].join(' ') ]
|
10
|
+
end
|
11
|
+
|
12
|
+
def disasm_sections(filename, sections)
|
13
|
+
# BFD for target file
|
14
|
+
tgt = Bfd::Target.new(filename)
|
15
|
+
puts "#{tgt.id}: #{tgt.filename}"
|
16
|
+
|
17
|
+
# Disassembler for BFD
|
18
|
+
disasm = Opcodes::Disassembler.new( :bfd => tgt )
|
19
|
+
|
20
|
+
# Disassemble until end of buffer is reached
|
21
|
+
sections.each do |name|
|
22
|
+
sec = tgt.sections[name]
|
23
|
+
raise "Section #{name} not in #{tgt.filename}" if not sec
|
24
|
+
|
25
|
+
disasm.disasm(sec).each { |i| print_insn i }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
if __FILE__ == $0
|
30
|
+
raise "Usage: #{$0} FILE SECTION [SECTION...]" if ARGV.length < 2
|
31
|
+
filename = ARGV.shift
|
32
|
+
|
33
|
+
disasm_sections(filename, ARGV)
|
34
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Disassemble BFD Symbol
|
3
|
+
# Copyright 2010 Thoughtgang <http://www.thoughtgang.org>
|
4
|
+
|
5
|
+
require 'BFD'
|
6
|
+
require 'Opcodes'
|
7
|
+
|
8
|
+
def print_insn( insn )
|
9
|
+
puts "%08X\t%s" % [ insn[:vma], insn[:insn].join(' ') ]
|
10
|
+
end
|
11
|
+
|
12
|
+
def disasm_symbols(filename, symbols)
|
13
|
+
# BFD for target file
|
14
|
+
tgt = Bfd::Target.new(filename)
|
15
|
+
puts "#{tgt.id}: #{tgt.filename}"
|
16
|
+
|
17
|
+
# Disassembler for BFD
|
18
|
+
disasm = Opcodes::Disassembler.new( :bfd => tgt )
|
19
|
+
|
20
|
+
# Disassemble until end of buffer is reached
|
21
|
+
symbols.each do |name|
|
22
|
+
sym = tgt.symbols[name]
|
23
|
+
raise "Symbol #{name} not in #{tgt.filename}" if not sym
|
24
|
+
|
25
|
+
disasm.disasm(sym).each { |i| print_insn i }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
if __FILE__ == $0
|
30
|
+
raise "Usage: #{$0} FILE SYMBOL [SYMBOL...]" if ARGV.length < 2
|
31
|
+
filename = ARGV.shift
|
32
|
+
|
33
|
+
disasm_symbols(filename, ARGV)
|
34
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# List available architectures
|
3
|
+
# Copyright 2010 Thoughtgang <http://www.thoughtgang.org>
|
4
|
+
|
5
|
+
require 'Opcodes'
|
6
|
+
|
7
|
+
if __FILE__ == $0
|
8
|
+
puts "Supported architectures:"
|
9
|
+
Opcodes::Disassembler.architectures.each { |a| puts "\t#{a}" }
|
10
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Disassemble x86 Bytes
|
3
|
+
# Copyright 2010 Thoughtgang <http://www.thoughtgang.org>
|
4
|
+
|
5
|
+
require 'Opcodes'
|
6
|
+
|
7
|
+
# print a disassembled instruction in standard disasm listing format
|
8
|
+
def print_insn( insn, buf )
|
9
|
+
# Unpack instruction bytes from binary string in buf
|
10
|
+
bytes = buf.unpack('C' * buf.length)[insn[:vma]...(insn[:vma]+insn[:size])]
|
11
|
+
|
12
|
+
# Convert bytes to hex strings
|
13
|
+
hex_str = bytes.collect { |b| "%02X" % b }.join(' ')
|
14
|
+
|
15
|
+
# Format as hexump, showing up to 8 bytes (8*2 hex + 8-1 spaces)
|
16
|
+
puts "%08X %-23.23s %s" % [insn[:vma], hex_str, insn[:insn].join(' ')]
|
17
|
+
end
|
18
|
+
|
19
|
+
# disassemble binary string using x86 architecture
|
20
|
+
def disasm_bytes( bytes )
|
21
|
+
# Disassembler for x86
|
22
|
+
disasm = Opcodes::Disassembler.new( :arch => 'x86' )
|
23
|
+
|
24
|
+
# disassemble until end of buffer is reached
|
25
|
+
pos = 0
|
26
|
+
while ( pos < bytes.length )
|
27
|
+
insn = disasm.disasm_insn( bytes, :vma => pos )
|
28
|
+
print_insn insn, bytes
|
29
|
+
pos += 1
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
# Convert array of hex byte strings to a binary string
|
35
|
+
def hex_to_bytes( bytes )
|
36
|
+
bytes.collect { |b| b.hex }.pack( 'C' * bytes.length )
|
37
|
+
end
|
38
|
+
|
39
|
+
if __FILE__ == $0
|
40
|
+
raise "Usage: #{$0} BYTE [BYTE...]" if ARGV.length == 0
|
41
|
+
|
42
|
+
disasm_bytes( hex_to_bytes(ARGV) )
|
43
|
+
end
|
data/lib/Opcodes.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
#!/usr/bin/env/ruby1.0
|
2
|
+
# Copyright 2010 Thoughtgang <http://www.thoughtgang.org>
|
3
|
+
# Ruby additions to the Opcodes module
|
4
|
+
|
5
|
+
require 'OpcodesExt'
|
6
|
+
|
7
|
+
module Opcodes
|
8
|
+
|
9
|
+
class Disassembler
|
10
|
+
|
11
|
+
=begin rdoc
|
12
|
+
Create a new disassembler.
|
13
|
+
Note: if the option :arch is not specified here or in Disassembler#disasm,
|
14
|
+
the generic_print_address method will be used -- which only generates the
|
15
|
+
VMA for an instruction.
|
16
|
+
=end
|
17
|
+
def self.new(args={})
|
18
|
+
dis = ext_new(args)
|
19
|
+
yield dis if block_given?
|
20
|
+
dis
|
21
|
+
end
|
22
|
+
|
23
|
+
=begin rdoc
|
24
|
+
Disassemble all bytes in a buffer. This is simply a wrapper for ext_disasm
|
25
|
+
that provides a default value for <i>args</i>.
|
26
|
+
See ext_disasm.
|
27
|
+
Note: the achhitecture of the target must be specified by the user if the
|
28
|
+
target is not a BFD::Target. Failure to specify an architecture will
|
29
|
+
result in instruction token arrays containing only the VMA of the
|
30
|
+
instruction. See Disassemnbler#new for more info.
|
31
|
+
=end
|
32
|
+
def disasm( target, args={} )
|
33
|
+
# Wrapper provides a default option
|
34
|
+
raise "Invalid target" if not target
|
35
|
+
|
36
|
+
ext_disasm(target, args)
|
37
|
+
end
|
38
|
+
|
39
|
+
=begin rdoc
|
40
|
+
Disassemble a single instruction in a target buffer. This is simply a wrapper
|
41
|
+
for ext_disasm_insn that provides a default value for <i>args</i>.
|
42
|
+
See ext_disasm_insn.
|
43
|
+
=end
|
44
|
+
def disasm_insn( target, args={} )
|
45
|
+
# Wrapper provides a default option
|
46
|
+
raise "Invalid target" if not target
|
47
|
+
|
48
|
+
ext_disasm_insn(target, args)
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
data/module/Arch.c
ADDED
@@ -0,0 +1,364 @@
|
|
1
|
+
/* Arch.c
|
2
|
+
* Disassembler definitions for architectures supported by libopcodes
|
3
|
+
* Copyright 2010 Thoughtgang <http://www.thoughtgang.org>
|
4
|
+
* Written by TG Community Developers <community@thoughtgang.org>
|
5
|
+
* Released under the GNU Public License, version 3.
|
6
|
+
* See http://www.gnu.org/licenses/gpl.txt for details.
|
7
|
+
*/
|
8
|
+
#include <string.h>
|
9
|
+
|
10
|
+
#include "Arch.h"
|
11
|
+
|
12
|
+
static int generic_print_address_wrapper(bfd_vma vma, disassemble_info *info ) {
|
13
|
+
generic_print_address(vma, info);
|
14
|
+
return 1;
|
15
|
+
}
|
16
|
+
|
17
|
+
static const Opcodes_disasm_def disasm_definitions[] = {
|
18
|
+
/* Goddamn GNU. They make it near-impossible to get a list of supported
|
19
|
+
* architectures at build OR run time. */
|
20
|
+
#ifdef ARCH_ALPHA
|
21
|
+
{"alpha", bfd_arch_alpha, bfd_mach_alpha_ev4, print_insn_alpha},
|
22
|
+
{"alphaev4", bfd_arch_alpha, bfd_mach_alpha_ev4,
|
23
|
+
print_insn_alpha},
|
24
|
+
{"alphaev5", bfd_arch_alpha, bfd_mach_alpha_ev5,
|
25
|
+
print_insn_alpha},
|
26
|
+
{"alphaev6", bfd_arch_alpha, bfd_mach_alpha_ev6,
|
27
|
+
print_insn_alpha},
|
28
|
+
#endif
|
29
|
+
#ifdef ARCH_ARM
|
30
|
+
{"big_arm", bfd_arch_arm, bfd_mach_arm_umknown,
|
31
|
+
print_insn_big_arm},
|
32
|
+
{"little_arm", bfd_arch_arm, bfd_mach_arm_unknown,
|
33
|
+
print_insn_little_arm},
|
34
|
+
// TODO: the other ARMs have to be big & little?
|
35
|
+
#endif
|
36
|
+
#ifdef ARCH_AVR
|
37
|
+
{"avr", bfd_arch_avr, bfd_mach_avr1, print_insn_avr},
|
38
|
+
{"avr1", bfd_arch_avr, bfd_mach_avr1, print_insn_avr},
|
39
|
+
{"avr2", bfd_arch_avr, bfd_mach_avr2, print_insn_avr},
|
40
|
+
{"avr25", bfd_arch_avr, bfd_mach_avr25, print_insn_avr},
|
41
|
+
{"avr3", bfd_arch_avr, bfd_mach_avr3, print_insn_avr},
|
42
|
+
{"avr31", bfd_arch_avr, bfd_mach_avr31, print_insn_avr},
|
43
|
+
{"avr35", bfd_arch_avr, bfd_mach_avr35, print_insn_avr},
|
44
|
+
{"avr4", bfd_arch_avr, bfd_mach_avr4, print_insn_avr},
|
45
|
+
{"avr5", bfd_arch_avr, bfd_mach_avr5, print_insn_avr},
|
46
|
+
{"avr51", bfd_arch_avr, bfd_mach_avr51, print_insn_avr},
|
47
|
+
{"avr6", bfd_arch_avr, bfd_mach_avr6, print_insn_avr},
|
48
|
+
#endif
|
49
|
+
#ifdef ARCH_BFIN
|
50
|
+
{"bfin", bfd_arch_bfin, bfd_mach_bfin, print_insn_bfin},
|
51
|
+
#endif
|
52
|
+
|
53
|
+
#ifdef ARCH_CR16
|
54
|
+
{"cr16", bfd_arch_cr16, bfd_mach_cr16, print_insn_cr16},
|
55
|
+
{"cr16c", bfd_arch_cr16c, bfd_mach_cr16c, print_insn_cr16},
|
56
|
+
#endif
|
57
|
+
#ifdef ARCH_CRX
|
58
|
+
{"crx", bfd_arch_crx, bfd_mach_crx, print_insn_crx},
|
59
|
+
#endif
|
60
|
+
#ifdef ARCH_D10V
|
61
|
+
{"d10v", bfd_arch_d10v, bfd_mach_d10v, print_insn_d10v},
|
62
|
+
{"d10v2", bfd_arch_d10v, bfd_mach_d10v_ts2, print_insn_d10v},
|
63
|
+
{"d10v3", bfd_arch_d10v, bfd_mach_d10v_ts3, print_insn_d10v},
|
64
|
+
#endif
|
65
|
+
#ifdef ARCH_D30V
|
66
|
+
{"d30v", bfd_arch_d30v, 0, print_insn_d30v},
|
67
|
+
#endif
|
68
|
+
#ifdef ARCH_DLX
|
69
|
+
{"dlx", bfd_arch_dlx, 0, print_insn_dlx},
|
70
|
+
#endif
|
71
|
+
#ifdef ARCH_FR30
|
72
|
+
{"fr30", bfd_arch_fr30, bfd_mach_fr30, print_insn_fr30},
|
73
|
+
#endif
|
74
|
+
#ifdef ARCH_FRV
|
75
|
+
{"frv", bfd_arch_frv, bfd_mach_frv, print_insn_frv},
|
76
|
+
{"frvsimple", bfd_arch_frv, bfd_mach_frvsimple, print_insn_frv},
|
77
|
+
{"fr300", bfd_arch_frv, bfd_mach_fr300, print_insn_frv},
|
78
|
+
{"fr400", bfd_arch_frv, bfd_mach_fr400, print_insn_frv},
|
79
|
+
{"fr450", bfd_arch_frv, bfd_mach_fr450, print_insn_frv},
|
80
|
+
{"frvtomcat", bfd_arch_frv, bfd_mach_frvtomcat, print_insn_frv},
|
81
|
+
{"fr500", bfd_arch_frv, bfd_mach_fr500, print_insn_frv},
|
82
|
+
{"fr550", bfd_arch_frv, bfd_mach_fr550, print_insn_frv},
|
83
|
+
#endif
|
84
|
+
#ifdef ARCH_H8300
|
85
|
+
{"h8300", bfd_arch_8300, bfd_mach_h8300, print_insn_h8300},
|
86
|
+
{"h8300h", bfd_arch_8300, bfd_mach_h8300h, print_insn_h8300h},
|
87
|
+
{"h8300hn", bfd_arch_8300, bfd_mach_h8300hn, print_insn_h8300h},
|
88
|
+
{"h8300s", bfd_arch_8300, bfd_mach_h8300s, print_insn_h8300s},
|
89
|
+
{"h8300sn", bfd_arch_8300, bfd_mach_h8300sn, print_insn_h8300s},
|
90
|
+
{"h8300sx", bfd_arch_8300, bfd_mach_h8300sx, print_insn_h8300s},
|
91
|
+
{"h8300sxn", bfd_arch_8300, bfd_mach_h8300sxn,
|
92
|
+
print_insn_h8300s},
|
93
|
+
#endif
|
94
|
+
#ifdef ARCH_H8500
|
95
|
+
{"h8500", bfd_arch_h8500, 0, print_insn_h8500},
|
96
|
+
#endif
|
97
|
+
#ifdef ARCH_HPPA
|
98
|
+
{"hppa", bfd_arch_hppa, bfd_mach_hppa10, print_insn_hppa},
|
99
|
+
{"hppa11", bfd_arch_hppa, bfd_mach_hppa11, print_insn_hppa},
|
100
|
+
{"hppa20", bfd_arch_hppa, bfd_mach_hppa20, print_insn_hppa},
|
101
|
+
{"hppa20w", bfd_arch_hppa, bfd_mach_hppa20w, print_insn_hppa},
|
102
|
+
#endif
|
103
|
+
#ifdef ARCH_I370
|
104
|
+
{"i370", bfd_arch_i370, 0, print_insn_i370},
|
105
|
+
#endif
|
106
|
+
#ifdef ARCH_I386
|
107
|
+
{"8086", bfd_arch_i386, bfd_mach_i386_i8086, print_insn_i386},
|
108
|
+
{"x86", bfd_arch_i386, bfd_mach_i386_i386, print_insn_i386},
|
109
|
+
{"x86_att", bfd_arch_i386, bfd_mach_i386_i386,
|
110
|
+
print_insn_i386_att},
|
111
|
+
{"x86_intel", bfd_arch_i386, bfd_mach_i386_i386_intel_syntax,
|
112
|
+
print_insn_i386_intel},
|
113
|
+
{"x86_64", bfd_arch_i386, bfd_mach_x86_64, print_insn_i386},
|
114
|
+
{"x86_64_att", bfd_arch_i386, bfd_mach_x86_64, print_insn_i386},
|
115
|
+
{"x86_64_intel", bfd_arch_i386, bfd_mach_x86_64_intel_syntax,
|
116
|
+
print_insn_i386},
|
117
|
+
#endif
|
118
|
+
#ifdef ARCH_i860
|
119
|
+
{"i860", bfd_arch_i860, 0, print_insn_i860},
|
120
|
+
#endif
|
121
|
+
#ifdef ARCH_i960
|
122
|
+
{"i960", bfd_arch_i960, bfd_mach_i960_core, print_insn_i960},
|
123
|
+
{"i960_hx", bfd_arch_i960, bfd_mach_i960_hx, print_insn_i960},
|
124
|
+
#endif
|
125
|
+
#ifdef ARCH_ia64
|
126
|
+
{"ia64", bfd_arch_ia64, bfd_mach_ia64_elf64, print_insn_ia64},
|
127
|
+
{"ia64_32", bfd_arch_ia64, bfd_mach_ia64_elf32,
|
128
|
+
print_insn_ia64},
|
129
|
+
#endif
|
130
|
+
#ifdef ARCH_IP2K
|
131
|
+
{"ip2k", bfd_arch_ip2k, bfd_mach_ip2022, print_insn_ip2k},
|
132
|
+
{"ip2kext", bfd_arch_ip2k, bfd_mach_ip2022ext, print_insn_ip2k},
|
133
|
+
#endif
|
134
|
+
#ifdef ARCH_IQ2000
|
135
|
+
{"iq2000", bfd_arch_iq2000, bfd_mach_iq2000, print_insn_iq2000},
|
136
|
+
{"iq10", bfd_arch_iq2000, bfd_mach_iq10, print_insn_iq2000},
|
137
|
+
#endif
|
138
|
+
#ifdef ARCH_LM32
|
139
|
+
{"lm32", bfd_arch_lm32, bfd_mach_lm32, print_insn_lm32},
|
140
|
+
#endif
|
141
|
+
#ifdef ARCH_M32C
|
142
|
+
{"m32c", bfd_arch_m32c, bfd_mach_m32c, print_insn_m32c},
|
143
|
+
{"m16c", bfd_arch_m32c, bfd_mach_m16c, print_insn_m32c},
|
144
|
+
#endif
|
145
|
+
#ifdef ARCH_M32R
|
146
|
+
{"m32r", bfd_arch_m32r, bfd_mach_m32r, print_insn_m32r},
|
147
|
+
{"m32rx", bfd_arch_m32r, bfd_mach_m32rx, print_insn_m32r},
|
148
|
+
{"m32r2", bfd_arch_m32r, bfd_mach_m32r2, print_insn_m32r},
|
149
|
+
#endif
|
150
|
+
#ifdef ARCH_M68HC11
|
151
|
+
{"m68hc11", bfd_arch_m68hc11, 0, print_insn_m68hc11},
|
152
|
+
#endif
|
153
|
+
#ifdef ARCH_M68HC12
|
154
|
+
{"m68hc12", bfd_arch_m68hc12, bfd_mach_m6812_default,
|
155
|
+
print_insn_m68hc12},
|
156
|
+
{"m68hc12s", bfd_arch_m68hc12, bfd_mach_m6812s,
|
157
|
+
print_insn_m68hc12},
|
158
|
+
#endif
|
159
|
+
#ifdef ARCH_M68K
|
160
|
+
{"m68k", bfd_arch_m68k, bfd_mach_m68000, print_insn_m68k},
|
161
|
+
{"m68008", bfd_arch_m68k, bfd_mach_m68008, print_insn_m68k},
|
162
|
+
{"m68010", bfd_arch_m68k, bfd_mach_m68010, print_insn_m68k},
|
163
|
+
{"m68020", bfd_arch_m68k, bfd_mach_m68020, print_insn_m68k},
|
164
|
+
{"m68030", bfd_arch_m68k, bfd_mach_m68030, print_insn_m68k},
|
165
|
+
{"m68040", bfd_arch_m68k, bfd_mach_m68040, print_insn_m68k},
|
166
|
+
{"m68060", bfd_arch_m68k, bfd_mach_m68060, print_insn_m68k},
|
167
|
+
{"m68060", bfd_arch_m68k, bfd_mach_m68060, print_insn_m68k},
|
168
|
+
{"m68k_cpu32", bfd_arch_m68k, bfd_mach_cpu32, print_insn_m68k},
|
169
|
+
{"m68k_fido", bfd_arch_m68k, bfd_mach_fido, print_insn_m68k},
|
170
|
+
#endif
|
171
|
+
#ifdef ARCH_M88K
|
172
|
+
{"m88k", bfd_arch_m88k, 0, print_insn_m88k},
|
173
|
+
#endif
|
174
|
+
#ifdef ARCH_MAXQ
|
175
|
+
{"maxq_big", bfd_arch_maxq, 0, print_insn_maxq_big},
|
176
|
+
{"maxq_little", bfd_arch_maxq, 0, print_insn_maxq_little},
|
177
|
+
{"maxq10_big", bfd_arch_maxq, bfd_mach_maxq10,
|
178
|
+
print_insn_maxq_big},
|
179
|
+
{"maxq10_little", bfd_arch_maxq, bfd_mach_maxq10,
|
180
|
+
print_insn_maxq_little},
|
181
|
+
{"maxq20_big", bfd_arch_maxq, bfd_mach_maxq20,
|
182
|
+
print_insn_maxq_big},
|
183
|
+
{"maxq20_little", bfd_arch_maxq, bfd_mach_maxq20,
|
184
|
+
print_insn_maxq_little},
|
185
|
+
#endif
|
186
|
+
#ifdef ARCH_MCORE
|
187
|
+
{"mcore", bfd_arch_mcore, 0, print_insn_mcore},
|
188
|
+
#endif
|
189
|
+
#ifdef ARCH_MEP
|
190
|
+
{"mep", bfd_arch_mep, 0, print_insn_mep},
|
191
|
+
#endif
|
192
|
+
#ifdef ARCH_MICROBLAZE
|
193
|
+
{"microblaze", bfd_arch_microblaze, print_insn_microblaze},
|
194
|
+
#endif
|
195
|
+
#ifdef ARCH_MIPS
|
196
|
+
{"big_mips", bfd_arch_mips, 0, print_insn_big_mips},
|
197
|
+
{"little_mips", bfd_arch_mips, 0, print_insn_little_mips},
|
198
|
+
#endif
|
199
|
+
#ifdef ARCH_MMIX
|
200
|
+
{"mmix", bfd_arch_mmix, 0, print_insn_mmix},
|
201
|
+
#endif
|
202
|
+
#ifdef ARCH_MN10200
|
203
|
+
{"mn10200", bfd_arch_mn10200, 0, print_insn_mn10200},
|
204
|
+
#endif
|
205
|
+
#ifdef ARCH_MN10300
|
206
|
+
{"mn10300", bfd_arch_mn10300, bfd_mach_mn10300,
|
207
|
+
print_insn_mn10300},
|
208
|
+
#endif
|
209
|
+
#ifdef ARCH_MOXIE
|
210
|
+
{"moxie", bfd_arch_moxie, bfd_mach_moxie, print_insn_moxie},
|
211
|
+
#endif
|
212
|
+
#ifdef ARCH_MSP430
|
213
|
+
{"msp430", bfd_arch_msp430, 0, print_insn_msp430},
|
214
|
+
#endif
|
215
|
+
#ifdef ARCH_MT
|
216
|
+
{"mt", bfd_arch_mt, 0, print_insn_mt},
|
217
|
+
#endif
|
218
|
+
#ifdef ARCH_NS32K
|
219
|
+
{"ns32k", bfd_arch_ns32k, 0, print_insn_ns32k},
|
220
|
+
#endif
|
221
|
+
#ifdef ARCH_OPENRISC
|
222
|
+
{"openrisc", bfd_arch_openrisc, 0, print_insn_openrisc},
|
223
|
+
#endif
|
224
|
+
#ifdef ARCH_OR32
|
225
|
+
{"big_or32", bfd_arch_or32, 0, print_insn_big_or32},
|
226
|
+
{"little_or32", bfd_arch_or32, 0, print_insn_little_or32},
|
227
|
+
#endif
|
228
|
+
#ifdef ARCH_PDP11
|
229
|
+
{"pdp11", bfd_arch_pdp11, 0, print_insn_pdp11},
|
230
|
+
#endif
|
231
|
+
#ifdef ARCH_PJ
|
232
|
+
{"pj", bfd_arch_pj, 0, print_insn_pj},
|
233
|
+
#endif
|
234
|
+
#ifdef ARCH_POWERPC
|
235
|
+
{"big_powerpc", bfd_arch_powerpc, 0, print_insn_big_powerpc},
|
236
|
+
{"little_powerpc", bfd_arch_powerpc, 0,
|
237
|
+
print_insn_little_powerpc},
|
238
|
+
{"big_powerpc32", bfd_arch_powerpc, bfd_mach_ppc,
|
239
|
+
print_insn_big_powerpc},
|
240
|
+
{"little_powerpc32", bfd_arch_powerpc, bfd_mach_ppc,
|
241
|
+
print_insn_little_powerpc},
|
242
|
+
{"big_powerpc64", bfd_arch_powerpc, bfd_mach_ppc64,
|
243
|
+
print_insn_big_powerpc},
|
244
|
+
{"little_powerpc64", bfd_arch_powerpc, bfd_mach_ppc64,
|
245
|
+
print_insn_little_powerpc},
|
246
|
+
#endif
|
247
|
+
#ifdef ARCH_RS6000
|
248
|
+
{"rs6000", bfd_arch_rs6000, bfd_mach_rs6k, print_insn_rs6000},
|
249
|
+
#endif
|
250
|
+
#ifdef ARCH_S390
|
251
|
+
{"s390", bfd_arch_s390, 0, print_insn_s390},
|
252
|
+
#endif
|
253
|
+
#ifdef ARCH_SCORE
|
254
|
+
{"big_score", bfd_arch_score, 0, print_insn_big_score},
|
255
|
+
{"little_score", bfd_arch_score, 0, print_insn_little_score},
|
256
|
+
#endif
|
257
|
+
#ifdef ARCH_SH
|
258
|
+
{"sh", bfd_arch_sh, bfd_mach_sh, print_insn_sh},
|
259
|
+
{"sh2", bfd_arch_sh, bfd_mach_sh2, print_insn_sh},
|
260
|
+
{"sh3", bfd_arch_sh, bfd_mach_sh3, print_insn_sh},
|
261
|
+
{"sh4", bfd_arch_sh, bfd_mach_sh4, print_insn_sh},
|
262
|
+
{"sh5", bfd_arch_sh, bfd_mach_sh5, print_insn_sh},
|
263
|
+
{"sh_dsp", bfd_arch_sh, bfd_mach_sh_dsp, print_insn_sh},
|
264
|
+
{"sh64", bfd_arch_sh, bfd_mach_sh, print_insn_sh64},
|
265
|
+
{"sh64x_media", bfd_mach_sh, bfd_mach_sh,
|
266
|
+
print_insn_sh64x_media},
|
267
|
+
#endif
|
268
|
+
#ifdef ARCH_SPARC
|
269
|
+
{"sparc", bfd_arch_sparc, bfd_mach_sparc, print_insn_sparc},
|
270
|
+
{"sparclite", bfd_arch_sparc, bfd_mach_sparc_sparclite,
|
271
|
+
print_insn_sparc},
|
272
|
+
{"sparclitev9", bfd_arch_sparc, bfd_mach_sparc_v9,
|
273
|
+
print_insn_sparc},
|
274
|
+
#endif
|
275
|
+
#ifdef ARCH_SPU
|
276
|
+
{"spu", bfd_arch_spu, bfd_mach_spu, print_insn_spu},
|
277
|
+
#endif
|
278
|
+
#ifdef ARCH_TIC30
|
279
|
+
{"tic30", bfd_arch_tic30, 0, print_insn_tic30},
|
280
|
+
#endif
|
281
|
+
#ifdef ARCH_TIC4X
|
282
|
+
{"tic3x", bfd_arch_tic4x, bfd_mach_tic3x, print_insn_tic4x},
|
283
|
+
{"tic4x", bfd_arch_tic4x, bfd_mach_tic4x, print_insn_tic4x},
|
284
|
+
#endif
|
285
|
+
#ifdef ARCH_TIC54X
|
286
|
+
{"tic54x", bfd_arch_tic54x, 0, print_insn_tic54x},
|
287
|
+
#endif
|
288
|
+
#ifdef ARCH_TIC80
|
289
|
+
{"tic80", bfd_arch_tic80, 0, print_insn_tic80},
|
290
|
+
#endif
|
291
|
+
#ifdef ARCH_V850
|
292
|
+
{"v850", bfd_arch_v850, bfd_mach_v850, print_insn_v850},
|
293
|
+
#endif
|
294
|
+
#ifdef ARCH_VAX
|
295
|
+
{"vax", bfd_arch_vax, 0, print_insn_vax},
|
296
|
+
#endif
|
297
|
+
#ifdef ARCH_W65
|
298
|
+
{"w65", bfd_arch_w65, 0, print_insn_w65},
|
299
|
+
#endif
|
300
|
+
#ifdef ARCH_XC16X
|
301
|
+
{"xc16x", bfd_arch_xc16x, bfd_mach_xc16x, print_insn_xc16x},
|
302
|
+
#endif
|
303
|
+
#ifdef ARCH_XSTORMY16
|
304
|
+
{"xstormy16", bfd_arch_xstormy16, bfd_mach_xstormy16,
|
305
|
+
print_insn_xstormy16},
|
306
|
+
#endif
|
307
|
+
#ifdef ARCH_XTENSA
|
308
|
+
{"xtensa", bfd_arch_xtensa, bfd_mach_xtensa, print_insn_xtensa},
|
309
|
+
#endif
|
310
|
+
#ifdef ARCH_Z80
|
311
|
+
{"z80", bfd_arch_z80, bfd_mach_z80full, print_insn_z80},
|
312
|
+
{"z80strict", bfd_arch_z80, bfd_mach_z80strict, print_insn_z80},
|
313
|
+
{"r800", bfd_arch_z80, bfd_mach_r800, print_insn_z80},
|
314
|
+
#endif
|
315
|
+
#ifdef ARCH_Z8K
|
316
|
+
{"z8001", bfd_arch_z8k, bfd_mach_z8001, print_insn_z8001},
|
317
|
+
{"z8002", bfd_arch_z8k, bfd_mach_z8002, print_insn_z8002},
|
318
|
+
#endif
|
319
|
+
/* NULL entry to ensure table ends up ok */
|
320
|
+
{"INVALID", bfd_arch_unknown, 0, generic_print_address_wrapper}
|
321
|
+
};
|
322
|
+
|
323
|
+
void Opcodes_disasm_iter( OPCODES_DISASM_ITER_FN fn, void * arg ) {
|
324
|
+
int i;
|
325
|
+
int num_defs = sizeof(disasm_definitions) / sizeof(Opcodes_disasm_def);
|
326
|
+
|
327
|
+
if (! fn ) {
|
328
|
+
return;
|
329
|
+
}
|
330
|
+
|
331
|
+
for ( i = 0; i < num_defs; i++ ) {
|
332
|
+
const Opcodes_disasm_def *def = &disasm_definitions[i];
|
333
|
+
if (! fn( def, arg ) ) {
|
334
|
+
break;
|
335
|
+
}
|
336
|
+
}
|
337
|
+
}
|
338
|
+
|
339
|
+
struct disasm_find_name_arg {
|
340
|
+
const char * name;
|
341
|
+
const Opcodes_disasm_def * def;
|
342
|
+
};
|
343
|
+
|
344
|
+
static int is_named_def( const Opcodes_disasm_def * def, void * arg ) {
|
345
|
+
struct disasm_find_name_arg * out = (struct disasm_find_name_arg *) arg;
|
346
|
+
if (! strcmp( out->name, def->name ) ) {
|
347
|
+
out->def = def;
|
348
|
+
return 0;
|
349
|
+
}
|
350
|
+
|
351
|
+
return 1;
|
352
|
+
}
|
353
|
+
|
354
|
+
const Opcodes_disasm_def * Opcodes_disasm_for_name( const char * name ) {
|
355
|
+
struct disasm_find_name_arg arg = { name, Opcodes_disasm_invalid() };
|
356
|
+
Opcodes_disasm_iter( is_named_def, &arg );
|
357
|
+
return arg.def;
|
358
|
+
}
|
359
|
+
|
360
|
+
const Opcodes_disasm_def * Opcodes_disasm_invalid( void ) {
|
361
|
+
int num_defs = sizeof(disasm_definitions) / sizeof(Opcodes_disasm_def);
|
362
|
+
return &disasm_definitions[num_defs-1];
|
363
|
+
}
|
364
|
+
|