java disassembler
jdisa disassembles a given java class file and shows the bytecode instructions.
it does not currently output the same as javap -c <file>...
committer: Markus Bröker <mbroeker@largo.homelinux.org>
new file mode 100644
--- /dev/null
+++ b/jdisa/Makefile
@@ -0,0 +1,49 @@
+ CC = gcc
+ LD = ld
+ YACC = bison -y
+ FLEX = flex
+ JAVAC = javac
+ CFLAGS = -Wall -Werror -O2 -ansi
+ LDFLAGS =
+
+ INCLUDE = -Iinclude
+TARGET = jdisa
+OBJECTS = main.o
+
+.SUFFIXES: .c .y .l
+
+.c.o:
+ $(CC) -c $(CFLAGS) $(INCLUDE) $(CONFIG) $<
+
+.y.c:
+ $(YACC) -d $< -o $@
+
+.l.c:
+ $(FLEX) -o $@ $<
+
+all: $(TARGET)
+
+
+$(TARGET): $(OBJECTS)
+ $(CC) $(CFLAGS) $(LDFLAGS) $(OBJECTS) -o $@
+
+tests/Test.class: tests/Test.java
+ $(JAVAC) -g:none -d tests/ $<
+
+debug: $(TARGET) tests/Test.class
+ ./jdisa tests/Test.class
+
+.PHONY: beauty clean distclean
+
+clean:
+ rm -f *.[oae];
+ rm -f *~;
+
+distclean: beauty
+ make clean
+ rm -f $(TARGET)
+ rm -f tests/Test.class
+
+beauty:
+ @indent *.c
+ @eraser *.c
new file mode 100644
--- /dev/null
+++ b/jdisa/main.c
@@ -0,0 +1,705 @@
+/**
+ * jdisa
+ *
+ * ByteCode Disassembler
+ * See http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#define BUF_SIZE 1023
+
+typedef unsigned char uchar_t;
+
+typedef uchar_t u1[1];
+typedef uchar_t u2[2];
+typedef uchar_t u4[4];
+typedef uchar_t u8[8];
+
+struct Header {
+ u4 magic;
+ u2 minor_version;
+ u2 major_version;
+ u2 constant_pool_count;
+};
+
+typedef struct Header Header;
+
+int main (int argc, char **argv)
+{
+ FILE *f;
+ uchar_t buffer[BUF_SIZE];
+ int i;
+ size_t num;
+ int OPCODE;
+ Header *cf;
+
+ if (argc != 2) {
+ fprintf (stderr, "Usage: %s <FILE>\n", argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ if ((f = fopen (argv[1], "r")) == NULL) {
+ perror ("FOPEN");
+ return EXIT_FAILURE;
+ }
+
+ if ((cf = malloc (sizeof (Header))) == NULL)
+ return EXIT_FAILURE;
+ if ((num = fread (cf, 1, sizeof (Header), f)) < 1)
+ return EXIT_FAILURE;
+
+ printf (" MAGIC: %2X%2X%2X%2X\n", cf->magic[0], cf->magic[1], cf->magic[2], cf->magic[3]);
+ printf ("VERSION: %02d.%02d\n", cf->major_version[1], cf->major_version[0]);
+ printf ("POOLCTN: %2d:%2d\n", cf->constant_pool_count[1], cf->constant_pool_count[0]);
+
+ if (cf != NULL)
+ free (cf);
+
+ OPCODE = 1;
+ while (!feof (f)) {
+ num = fread (buffer, 1, sizeof (buffer), f);
+ for (i = 0; i < num; i++) {
+ if (OPCODE) {
+ switch (buffer[i]) {
+ case 50:
+ printf ("aaload ");
+ break;
+ case 83:
+ printf ("aastore ");
+ break;
+ case 1:
+ printf ("aconst_null ");
+ break;
+ case 25:
+ printf ("aload ");
+ break;
+ case 42:
+ printf ("aload_0 ");
+ break;
+ case 43:
+ printf ("aload_1 ");
+ break;
+ case 44:
+ printf ("aload_2 ");
+ break;
+ case 45:
+ printf ("aload_3 ");
+ break;
+ case 189:
+ printf ("anewarray ");
+ break;
+ case 176:
+ printf ("areturn ");
+ break;
+ case 190:
+ printf ("arraylength ");
+ break;
+ case 58:
+ printf ("astore ");
+ break;
+ case 75:
+ printf ("astore_0 ");
+ break;
+ case 76:
+ printf ("astore_1 ");
+ break;
+ case 77:
+ printf ("astore_2 ");
+ break;
+ case 78:
+ printf ("astore_3 ");
+ break;
+ case 191:
+ printf ("athrow ");
+ break;
+ case 51:
+ printf ("baload ");
+ break;
+ case 84:
+ printf ("bastore ");
+ break;
+ case 16:
+ printf ("bipush ");
+ break;
+ case 52:
+ printf ("caload ");
+ break;
+ case 85:
+ printf ("castore ");
+ break;
+ case 192:
+ printf ("checkcast ");
+ break;
+ case 144:
+ printf ("d2f ");
+ break;
+ case 142:
+ printf ("d2i ");
+ break;
+ case 143:
+ printf ("d2l ");
+ break;
+ case 99:
+ printf ("dadd ");
+ break;
+ case 49:
+ printf ("daload ");
+ break;
+ case 82:
+ printf ("dastore ");
+ break;
+ case 152:
+ printf ("dcmp ");
+ break;
+ case 14:
+ printf ("dconst_0 ");
+ break;
+ case 15:
+ printf ("dconst_1 ");
+ break;
+ case 111:
+ printf ("ddiv ");
+ break;
+ case 24:
+ printf ("dload ");
+ break;
+ case 38:
+ printf ("dload_0 ");
+ break;
+ case 39:
+ printf ("dload_1 ");
+ break;
+ case 40:
+ printf ("dload_2 ");
+ break;
+ case 41:
+ printf ("dload_3 ");
+ break;
+ case 107:
+ printf ("dmul ");
+ break;
+ case 119:
+ printf ("dneg ");
+ break;
+ case 115:
+ printf ("drem ");
+ break;
+ case 175:
+ printf ("dreturn ");
+ break;
+ case 57:
+ printf ("dstore ");
+ break;
+ case 71:
+ printf ("dstore_0 ");
+ break;
+ case 72:
+ printf ("dstore_1 ");
+ break;
+ case 73:
+ printf ("dstore_2 ");
+ break;
+ case 74:
+ printf ("dstore_3 ");
+ break;
+ case 103:
+ printf ("dsub ");
+ break;
+ case 89:
+ printf ("dup ");
+ break;
+ case 90:
+ printf ("dup_x1 ");
+ break;
+ case 91:
+ printf ("dup_x2 ");
+ break;
+ case 92:
+ printf ("dup2 ");
+ break;
+ case 93:
+ printf ("dup2_x1 ");
+ break;
+ case 94:
+ printf ("dup2_x2 ");
+ break;
+ case 141:
+ printf ("f2d ");
+ break;
+ case 139:
+ printf ("f2i ");
+ break;
+ case 140:
+ printf ("f2l ");
+ break;
+ case 98:
+ printf ("fadd ");
+ break;
+ case 48:
+ printf ("faload ");
+ break;
+ case 81:
+ printf ("fastore ");
+ break;
+ case 150:
+ printf ("fcmpg ");
+ break;
+ case 149:
+ printf ("fcmpl ");
+ break;
+ case 11:
+ printf ("fconst_0 ");
+ break;
+ case 12:
+ printf ("fconst_1 ");
+ break;
+ case 13:
+ printf ("fconst_2 ");
+ break;
+ case 110:
+ printf ("fdiv ");
+ break;
+ case 23:
+ printf ("fload ");
+ break;
+ case 34:
+ printf ("fload_0 ");
+ break;
+ case 35:
+ printf ("fload_1 ");
+ break;
+ case 36:
+ printf ("fload_2 ");
+ break;
+ case 37:
+ printf ("fload_3 ");
+ break;
+ case 106:
+ printf ("fmul ");
+ break;
+ case 118:
+ printf ("fneg ");
+ break;
+ case 114:
+ printf ("frem ");
+ break;
+ case 174:
+ printf ("freturn ");
+ break;
+ case 56:
+ printf ("fstore ");
+ break;
+ case 67:
+ printf ("fstore_0 ");
+ break;
+ case 68:
+ printf ("fstore_1 ");
+ break;
+ case 69:
+ printf ("fstore_2 ");
+ break;
+ case 70:
+ printf ("fstore_3 ");
+ break;
+ case 102:
+ printf ("fsub ");
+ break;
+ case 180:
+ printf ("getfield ");
+ break;
+ case 178:
+ printf ("getstatic ");
+ break;
+ case 167:
+ printf ("goto ");
+ break;
+ case 200:
+ printf ("goto_w ");
+ break;
+ case 145:
+ printf ("i2b ");
+ break;
+ case 146:
+ printf ("i2c ");
+ break;
+ case 135:
+ printf ("i2d ");
+ break;
+ case 134:
+ printf ("i2f ");
+ break;
+ case 133:
+ printf ("i2l ");
+ break;
+ case 147:
+ printf ("i2s ");
+ break;
+ case 96:
+ printf ("iadd ");
+ break;
+ case 46:
+ printf ("iaload ");
+ break;
+ case 126:
+ printf ("iand ");
+ break;
+ case 79:
+ printf ("iastore ");
+ break;
+ case 2:
+ printf ("iconst_m1 ");
+ break;
+ case 3:
+ printf ("iconst_0 ");
+ break;
+ case 4:
+ printf ("iconst_1 ");
+ break;
+ case 5:
+ printf ("iconst_2 ");
+ break;
+ case 6:
+ printf ("iconst_3 ");
+ break;
+ case 7:
+ printf ("iconst_4 ");
+ break;
+ case 8:
+ printf ("iconst_5 ");
+ break;
+ case 108:
+ printf ("idiv ");
+ break;
+ case 165:
+ printf ("if_acmpeq ");
+ break;
+ case 166:
+ printf ("if_acmpne ");
+ break;
+ case 159:
+ printf ("if_icmpeq ");
+ break;
+ case 160:
+ printf ("if_icmpne ");
+ break;
+ case 161:
+ printf ("if_icmplt ");
+ break;
+ case 162:
+ printf ("if_icmpge ");
+ break;
+ case 163:
+ printf ("if_icmpgt ");
+ break;
+ case 164:
+ printf ("if_icmple ");
+ break;
+ case 153:
+ printf ("ifeq ");
+ break;
+ case 154:
+ printf ("ifne ");
+ break;
+ case 155:
+ printf ("iflt ");
+ break;
+ case 156:
+ printf ("ifge ");
+ break;
+ case 157:
+ printf ("ifgt ");
+ break;
+ case 158:
+ printf ("ifle ");
+ break;
+ case 199:
+ printf ("ifnonnull ");
+ break;
+ case 198:
+ printf ("ifnull ");
+ break;
+ case 132:
+ printf ("iinc %d %d\n", buffer[i + 1], buffer[i + 2]);
+ i += 2;
+ continue;
+ break;
+ case 21:
+ printf ("iload ");
+ break;
+ case 26:
+ printf ("iload_0 ");
+ break;
+ case 27:
+ printf ("iload_1 ");
+ break;
+ case 28:
+ printf ("iload_2 ");
+ break;
+ case 29:
+ printf ("iload_3 ");
+ break;
+ case 104:
+ printf ("imul ");
+ break;
+ case 116:
+ printf ("ineg ");
+ break;
+ case 193:
+ printf ("instanceof ");
+ break;
+ case 185:
+ printf ("invokeinterface ");
+ break;
+ case 183:
+ printf ("invokespecial ");
+ break;
+ case 184:
+ printf ("invokestatic ");
+ break;
+ case 182:
+ printf ("invokevirtual ");
+ break;
+ case 128:
+ printf ("ior ");
+ break;
+ case 112:
+ printf ("irem ");
+ break;
+ case 172:
+ printf ("ireturn ");
+ break;
+ case 120:
+ printf ("ishl ");
+ break;
+ case 122:
+ printf ("ishr ");
+ break;
+ case 54:
+ printf ("istore ");
+ break;
+ case 59:
+ printf ("istore_0 ");
+ break;
+ case 60:
+ printf ("istore_1 ");
+ break;
+ case 61:
+ printf ("istore_2 ");
+ break;
+ case 62:
+ printf ("istore_3 ");
+ break;
+ case 100:
+ printf ("isub ");
+ break;
+ case 124:
+ printf ("iushr ");
+ break;
+ case 130:
+ printf ("ixor ");
+ break;
+ case 168:
+ printf ("jsr ");
+ break;
+ case 201:
+ printf ("jsr_w ");
+ break;
+ case 138:
+ printf ("l2d ");
+ break;
+ case 137:
+ printf ("l2f ");
+ break;
+ case 136:
+ printf ("l2i ");
+ break;
+ case 97:
+ printf ("ladd ");
+ break;
+ case 47:
+ printf ("laload ");
+ break;
+ case 127:
+ printf ("land ");
+ break;
+ case 80:
+ printf ("lastore ");
+ break;
+ case 148:
+ printf ("lcmd ");
+ break;
+ case 9:
+ printf ("lconst_0 ");
+ break;
+ case 10:
+ printf ("lconst_1 ");
+ break;
+ case 18:
+ printf ("ldc ");
+ break;
+ case 19:
+ printf ("ldc_w ");
+ break;
+ case 20:
+ printf ("ldc2_w ");
+ break;
+ case 109:
+ printf ("ldiv ");
+ break;
+ case 22:
+ printf ("lload ");
+ break;
+ case 30:
+ printf ("lload_0 ");
+ break;
+ case 31:
+ printf ("lload_1 ");
+ break;
+ case 32:
+ printf ("lload_2 ");
+ break;
+ case 33:
+ printf ("lload_3 ");
+ break;
+ case 105:
+ printf ("lmul ");
+ break;
+ case 117:
+ printf ("lneg ");
+ break;
+ case 171:
+ printf ("lookupswitch ");
+ break;
+ case 129:
+ printf ("lor ");
+ break;
+ case 113:
+ printf ("lrem ");
+ break;
+ case 173:
+ printf ("lreturn ");
+ break;
+ case 121:
+ printf ("lshl ");
+ break;
+ case 123:
+ printf ("lshr ");
+ break;
+ case 55:
+ printf ("lstore ");
+ break;
+ case 63:
+ printf ("lstore_0 ");
+ break;
+ case 64:
+ printf ("lstore_1 ");
+ break;
+ case 65:
+ printf ("lstore_2 ");
+ break;
+ case 66:
+ printf ("lstore_3 ");
+ break;
+ case 101:
+ printf ("lsub ");
+ break;
+ case 125:
+ printf ("lushr ");
+ break;
+ case 131:
+ printf ("lxor ");
+ break;
+ case 194:
+ printf ("monitorenter ");
+ break;
+ case 195:
+ printf ("monitorexit ");
+ break;
+ case 197:
+ printf ("multianewarray ");
+ break;
+ case 187:
+ printf ("new ");
+ break;
+ case 188:
+ printf ("newarray ");
+ break;
+ case 0:
+ printf ("nop ");
+ break;
+ case 87:
+ printf ("pop ");
+ break;
+ case 88:
+ printf ("pop2 ");
+ break;
+ case 181:
+ printf ("putfield ");
+ break;
+ case 179:
+ printf ("putstatic ");
+ break;
+ case 169:
+ printf ("ret ");
+ break;
+ case 177:
+ printf ("return ");
+ break;
+ case 53:
+ printf ("saload ");
+ break;
+ case 86:
+ printf ("sastore ");
+ break;
+ case 17:
+ printf ("sipush ");
+ break;
+ case 95:
+ printf ("swap ");
+ break;
+ case 170:
+ printf ("tableswitch ");
+ break;
+ case 196:
+ printf ("wide ");
+ break;
+ case 202: /* reserved item */
+ printf ("breakpoint ");
+ break;
+ case 254: /* reserved item */
+ printf ("impdep1 ");
+ break;
+ case 255: /* reserved item */
+ printf ("impdep2 ");
+ break;
+ default:
+ printf ("OPCODE %02X(%d) ", buffer[i], buffer[i]);
+ }
+ OPCODE = 0;
+ } else
+ switch (buffer[i]) {
+ case '\0':
+ case '>':
+ case '<':
+ printf ("\n");
+ OPCODE = 1;
+ break;
+ default:
+ if (isprint (buffer[i]))
+ printf ("%c", buffer[i]);
+ else
+ printf ("%02X ", buffer[i]);
+ }
+ }
+ }
+
+ printf ("\n");
+
+ if (f != NULL)
+ fclose (f);
+
+ return EXIT_SUCCESS;
+}
new file mode 100644
--- /dev/null
+++ b/jdisa/tests/Test.java
@@ -0,0 +1,11 @@
+public class Test {
+ public static void main (String args[]) {
+ int i;
+ try {
+ i = Integer.parseInt (args[0]);
+ System.out.printf ("%d%n", i + 5);
+ } catch (Exception e) {
+ e.printStackTrace ();
+ }
+ }
+}