Exemplo n.º 1
0
    static void read_value_internal(const std::shared_ptr<type_t>& type, const symbols_t& symbols, reflectable& reflectable)
    {
        // read sub-type values
        if (VAL* base_type_index = get_base_type_index_opt(*type).get())
        {
            VAL& base_type = get_type(*base_type_index);
            read_value_internal(base_type, symbols, reflectable);
        }

        // read current type values
        VAL& field_vector = get_field_vector(*type);
        VAR symbols_iter = std::begin(symbols);
        VAL symbols_end = std::end(symbols);
        for (VAL& field_kvp : field_vector)
        {
            if (symbols_iter != symbols_end)
            {
                VAL& field = field_kvp.second;
                VAL& field_symbol = *symbols_iter;
                VAL& field_type_index = get_type_index(*field);
                VAL& field_type_descriptor = get_type_descriptor(field_type_index);
                VAL& field_ptr = static_cast<char*>(static_cast<void*>(&reflectable)) + get_value_offset(*field);
                read_value(*field_type_descriptor, field_symbol, field_ptr);
                ++symbols_iter;
            }
        }
    }
Exemplo n.º 2
0
 void write_value(const reflectable& source_reflectable, symbol& target_symbol)
 {
     VAL& type = get_type(source_reflectable);
     VAL& type_index = get_type_index(*type);
     VAL& type_descriptor = get_type_descriptor(type_index);
     write_value(*type_descriptor, static_cast<const void*>(&source_reflectable), target_symbol);
 }
Exemplo n.º 3
0
int readelf_main(int argc, char *argv[])
{
	FILE *fp;

	if (argc < 2)
	{
		printf("Usage: readelf elf_file \n");
		return -1;
	}

	fp = fopen(argv[1], "rb");
	if (fp == NULL)
	{
		printf("file <%s> open error\n", argv[1]);
		return -1;
	}
	// verify that fp1 not NULL
	assert(fp);
	
	char buf[HSIZE];
	int n;

	n = fread(buf, HSIZE, 1, fp);
	printf("n = %d\n", n);
	printf("HSIZE = %d\n", HSIZE);
	if (n != 1)
	{
		printf("file <%s> read error\n", argv[1]);
		return -1;
	}
	fclose(fp);

	Elf32_Ehdr * p;
	p = (Elf32_Ehdr *)buf;

	printf("type = %d\n", p->e_type);
	printf("Type: %s\n", s[get_type_index(p->e_type)].string);

	return 0;
}
Exemplo n.º 4
0
    void write_value_internal(const std::shared_ptr<type_t>& type, const reflectable& reflectable, symbols_t& symbols)
    {
        // write sub-type values
        if (VAL* base_type_index = get_base_type_index_opt(*type).get())
        {
            VAL& base_type = get_type(*base_type_index);
            write_value_internal(base_type, reflectable, symbols);
        }

        // write current type values
        VAL& field_vector = get_field_vector(*type);
        for (VAL& field_kvp : field_vector)
        {
            symbol field_symbol_mvb{};
            VAL& field = field_kvp.second;
            VAL& field_type_index = get_type_index(*field);
            VAL& field_type_descriptor = get_type_descriptor(field_type_index);
            VAL& field_ptr = static_cast<const char*>(static_cast<const void*>(&reflectable)) + get_value_offset(*field);
            write_value(*field_type_descriptor, field_ptr, field_symbol_mvb);
            symbols.emplace_back(std::move(field_symbol_mvb));
        }
    }