#include <string.h>
#include <glib.h>
#include <stdlib.h>
+#include <errno.h>
#include "meta.h"
#include "util.h"
#include "dump.h"
"// Copyright (C) 2001 Ximian, Inc.\n\n");
}
+static void
+dump_cattrs (MonoImage *m, guint32 token, const char *indent)
+{
+ GList *tmp, *list;
+
+ list = dis_get_custom_attrs (m, token);
+ for (tmp = list; tmp; tmp = tmp->next) {
+ fprintf (output, "%s%s\n", indent, (char*)tmp->data);
+ g_free (tmp->data);
+ }
+ g_list_free (list);
+}
+
static void
dis_directive_assembly (MonoImage *m)
{
mono_metadata_decode_row (t, 0, cols, MONO_ASSEMBLY_SIZE);
+ fprintf (output, ".assembly '%s'\n{\n",
+ mono_metadata_string_heap (m, cols [MONO_ASSEMBLY_NAME]));
+ dump_cattrs (m, MONO_TOKEN_ASSEMBLY | 1, " ");
fprintf (output,
- ".assembly '%s'\n"
- "{\n"
" .hash algorithm 0x%08x\n"
" .ver %d:%d:%d:%d"
"%s %s"
"%s"
"\n"
"}\n",
- mono_metadata_string_heap (m, cols [MONO_ASSEMBLY_NAME]),
cols [MONO_ASSEMBLY_HASH_ALG],
cols [MONO_ASSEMBLY_MAJOR_VERSION], cols [MONO_ASSEMBLY_MINOR_VERSION],
cols [MONO_ASSEMBLY_BUILD_NUMBER], cols [MONO_ASSEMBLY_REV_NUMBER],
{
MonoTableInfo *t = &m->tables [MONO_TABLE_FIELD];
guint32 cols [MONO_FIELD_SIZE];
+ char rva_desc [32];
+ guint32 rva;
int i;
if (end > t->rows + 1) {
}
for (i = start; i < end; i++){
- char *sig, *flags;
+ char *sig, *flags, *attrs = NULL;
+ guint32 field_offset = -1;
mono_metadata_decode_row (t, i, cols, MONO_FIELD_SIZE);
sig = get_field_signature (m, cols [MONO_FIELD_SIGNATURE]);
flags = field_flags (cols [MONO_FIELD_FLAGS]);
+
+ if (cols [MONO_FIELD_FLAGS] & FIELD_ATTRIBUTE_HAS_FIELD_RVA) {
+ mono_metadata_field_info (m, i, NULL, &rva, NULL);
+ g_snprintf (rva_desc, sizeof (rva_desc), " at D_%08x", rva);
+ } else {
+ rva_desc [0] = 0;
+ }
+ mono_metadata_field_info (m, i, &field_offset, NULL, NULL);
+ if (field_offset != -1)
+ attrs = g_strdup_printf ("[%d]", field_offset);
if (cols [MONO_FIELD_FLAGS] & FIELD_ATTRIBUTE_LITERAL){
char *lit;
guint32 const_cols [MONO_CONSTANT_SIZE];
mono_metadata_string_heap (m, cols [MONO_FIELD_NAME]));
fprintf (output, "%s\n", lit);
g_free (lit);
- } else
- fprintf (output, " .field %s %s %s\n",
- flags, sig,
- mono_metadata_string_heap (m, cols [MONO_FIELD_NAME]));
+ } else
+ fprintf (output, " .field %s %s %s %s%s\n",
+ attrs? attrs: "", flags, sig,
+ mono_metadata_string_heap (m, cols [MONO_FIELD_NAME]), rva_desc);
+ g_free (attrs);
g_free (flags);
g_free (sig);
+ dump_cattrs (m, MONO_TOKEN_FIELD_DEF | (i + 1), " ");
}
}
g_free (impl_flags);
fprintf (output, " {\n");
+ dump_cattrs (m, MONO_TOKEN_METHOD_DEF | (i + 1), " ");
+ /* FIXME: need to sump also param custom attributes */
fprintf (output, " // Method begins at RVA 0x%x\n", cols [MONO_METHOD_RVA]);
dis_code (m, cols [MONO_METHOD_RVA]);
- fprintf (output, " }\n\n");
+ fprintf (output, " } // end of method %s\n\n", sig_str);
mono_metadata_free_method_signature (ms);
g_free (sig_str);
}
for (i = start; i < end; ++i) {
char *sig = dis_property_signature (m, i);
fprintf (output, "\t.property %s\n\t{\n", sig);
+ dump_cattrs (m, MONO_TOKEN_PROPERTY | (i + 1), "\t\t");
dis_property_methods (m, i);
fprintf (output, "\t}\n");
g_free (sig);
for (i = start; i < end; ++i) {
char *sig = dis_event_signature (m, i);
fprintf (output, "\t.event %s\n\t{\n", sig);
+ dump_cattrs (m, MONO_TOKEN_EVENT | (i + 1), "\t\t");
dis_event_methods (m, i);
fprintf (output, "\t}\n");
g_free (sig);
dis_interfaces (m, n + 1);
fprintf (output, " {\n");
+ dump_cattrs (m, MONO_TOKEN_TYPE_DEF | (n + 1), " ");
if (mono_metadata_packing_from_typedef (m, n + 1, &packing_size, &class_size)) {
fprintf (output, " .pack %d\n", packing_size);
dis_property_list (m, n);
dis_event_list (m, n);
- fprintf (output, " }\n");
+ fprintf (output, " } // end of type %s%s%s\n", nspace, *nspace? ".": "", name);
if (*nspace)
fprintf (output, "}\n");
fprintf (output, "\n");
dis_type (m, i);
}
+/**
+ * dis_data:
+ * @m: metadata context
+ *
+ * disassembles all data blobs references in the FieldRVA table in the @m context
+ */
+static void
+dis_data (MonoImage *m)
+{
+ MonoTableInfo *t = &m->tables [MONO_TABLE_FIELDRVA];
+ MonoTableInfo *ft = &m->tables [MONO_TABLE_FIELD];
+ int i, b;
+ const char *rva, *sig;
+ guint32 align, size;
+ guint32 cols [MONO_FIELD_RVA_SIZE];
+ MonoType *type;
+
+ for (i = 0; i < t->rows; i++) {
+ mono_metadata_decode_row (t, i, cols, MONO_FIELD_RVA_SIZE);
+ rva = mono_cli_rva_map (m->image_info, cols [MONO_FIELD_RVA_RVA]);
+ sig = mono_metadata_blob_heap (m, mono_metadata_decode_row_col (ft, cols [MONO_FIELD_RVA_FIELD] -1, MONO_FIELD_SIGNATURE));
+ mono_metadata_decode_value (sig, &sig);
+ /* FIELD signature == 0x06 */
+ g_assert (*sig == 0x06);
+ type = mono_metadata_parse_field_type (m, 0, sig + 1, &sig);
+ mono_class_init (mono_class_from_mono_type (type));
+ size = mono_class_value_size (mono_class_from_mono_type (type), &align);
+ fprintf (output, ".data D_%08x = bytearray (", cols [MONO_FIELD_RVA_RVA]);
+ for (b = 0; b < size; ++b) {
+ if (!(b % 16))
+ fprintf (output, "\n\t");
+ fprintf (output, " %02x", rva [b] & 0xff);
+ }
+ fprintf (output, ") // size: %d\n", size);
+ }
+}
+
struct {
const char *name;
int table;
{ "--assembly", MONO_TABLE_ASSEMBLY, dump_table_assembly },
{ "--assemblyref", MONO_TABLE_ASSEMBLYREF, dump_table_assemblyref },
{ "--fields", MONO_TABLE_FIELD, dump_table_field },
+ { "--marshal", MONO_TABLE_FIELDMARSHAL, dump_table_field_marshal },
{ "--memberref", MONO_TABLE_MEMBERREF, dump_table_memberref },
{ "--param", MONO_TABLE_PARAM, dump_table_param },
{ "--typedef", MONO_TABLE_TYPEDEF, dump_table_typedef },
{ "--typeref", MONO_TABLE_TYPEREF, dump_table_typeref },
+ { "--exported", MONO_TABLE_EXPORTEDTYPE, dump_table_exported },
{ "--nested", MONO_TABLE_NESTEDCLASS, dump_table_nestedclass },
{ "--interface", MONO_TABLE_INTERFACEIMPL, dump_table_interfaceimpl },
{ "--classlayout", MONO_TABLE_CLASSLAYOUT, dump_table_class_layout },
{ "--moduleref", MONO_TABLE_MODULEREF, dump_table_moduleref },
{ "--module", MONO_TABLE_MODULE, dump_table_module },
{ "--method", MONO_TABLE_METHOD, dump_table_method },
+ { "--methodimpl", MONO_TABLE_METHODIMPL, dump_table_methodimpl },
{ "--methodsem", MONO_TABLE_METHODSEMANTICS, dump_table_methodsem },
+ { "--manifest", MONO_TABLE_MANIFESTRESOURCE, dump_table_manifest },
{ NULL, -1 }
};
MonoImageOpenStatus status;
MonoImage *img;
- ass = mono_assembly_open (file, NULL, &status);
+ ass = mono_assembly_open (file, &status);
if (ass == NULL){
fprintf (stderr, "Error while trying to process %s\n", file);
return;
dis_directive_assemblyref (img);
dis_directive_assembly (img);
dis_types (img);
+ dis_data (img);
}
mono_image_close (img);
static void
usage (void)
{
- GString *args = g_string_new ("[--help] [--mscorlib] ");
+ GString *args = g_string_new ("[--output=filename] [--help] [--mscorlib] ");
int i;
for (i = 0; table_list [i].name != NULL; i++){
dump_header_data_p = TRUE;
else if (strcmp (argv [i], "--mscorlib") == 0) {
substitute_with_mscorlib_p = TRUE;
- i++;
- }
- else if (strcmp (argv [i], "--help") == 0)
+ continue;
+ } else if (strncmp (argv [i], "--output=", 9) == 0) {
+ output = fopen (argv [i]+9, "w");
+ if (output == NULL) {
+ fprintf (stderr, "Can't open output file `%s': %s\n",
+ argv [i]+9, strerror (errno));
+ exit (1);
+ }
+ continue;
+ } else if (strcmp (argv [i], "--help") == 0)
usage ();
for (j = 0; table_list [j].name != NULL; j++) {
if (strcmp (argv [i], table_list [j].name) == 0)