ObjFile *MakeData(ObjFactory &factory) { ObjFile *rv = factory.MakeFile("test.dat"); std::time_t x = std::time(0); rv->SetFileTime(*std::localtime(&x)); ObjSourceFile *sf = factory.MakeSourceFile("test.dat"); rv->Add(sf); ObjSourceFile *sf1 = factory.MakeSourceFile("q.dat"); rv->Add(sf1); ObjSection *sect = factory.MakeSection("code"); codeSection = sect; rv->Add(sect); ObjSymbol *s1 = factory.MakePublicSymbol("public"); rv->Add(s1); ObjSymbol *s1a = factory.MakePublicSymbol("2public"); s1a->SetBaseType(BuildType(*rv, factory)); rv->Add(s1a); ObjSymbol *s2 = factory.MakeLocalSymbol("local"); s2->SetBaseType(factory.MakeType(ObjType::eInt)); rv->Add(s2); ObjSymbol *s3 = factory.MakeAutoSymbol("auto"); s3->SetOffset(factory.MakeExpression(-8)); rv->Add(s3); ObjSymbol *s4 = factory.MakeExternalSymbol("extern"); rv->Add(s4); ObjMemory *mem = factory.MakeData((ObjByte *)"\x44\x22\x33\x11", 4); ObjLineNo *l = factory.MakeLineNo(sf, 3); mem->Add(factory.MakeDebugTag(l)); sect->Add(mem); mem = factory.MakeData((ObjByte *)"\xaa\xbb\x33", 3); mem->Add(factory.MakeDebugTag(s1)); sect->Add(mem); mem = factory.MakeData((ObjByte *)"\xf1\x9a\x33", 3); mem->Add(factory.MakeDebugTag(s2)); l = factory.MakeLineNo(sf1, 4); mem->Add(factory.MakeDebugTag(l)); sect->Add(mem); mem = factory.MakeData((ObjByte *)"\x32\x17\x33", 3); mem->Add(factory.MakeDebugTag(s3)); sect->Add(mem); ObjExpression *left = factory.MakeExpression(s4); ObjExpression *right = factory.MakeExpression(7); mem = factory.MakeFixup(factory.MakeExpression(ObjExpression::eAdd, left, right), 4); sect->Add(mem); mem = factory.MakeData((ObjByte *)"\x55\x44\x33", 3); mem->Add(factory.MakeDebugTag(s4)); mem->Add(factory.MakeDebugTag(s1a)); sect->Add(mem); BuildBrowse(*rv, factory, l); ObjExportSymbol *es = factory.MakeExportSymbol("export"); es->SetExternalName("myexport"); es->SetByOrdinal(false); rv->Add(es); ObjExportSymbol *es1 = factory.MakeExportSymbol("export1"); es1->SetOrdinal(500); es1->SetByOrdinal(true); rv->Add(es1); ObjImportSymbol *is = factory.MakeImportSymbol("import"); is->SetExternalName("myimport"); is->SetDllName("mydll"); rv->Add(is); ObjImportSymbol *is1 = factory.MakeImportSymbol("import1"); is1->SetByOrdinal(true); is1->SetOrdinal(512); is1->SetDllName("mydll"); rv->Add(is1); return rv; }
bool Section::MakeData(ObjFactory &factory, AsmFile *fil) { bool rv = true; int pc = 0; int pos = 0; unsigned char buf[1024]; Fixup f; int n; ObjSection *sect = objectSection; if (sect) { sect->SetAlignment(align); instructionPos = 0; while ((n = GetNext(f, buf+pos, sizeof(buf) - pos)) != 0) { if (n > 0) { pos += n; if (pos == sizeof(buf)) { ObjMemory *mem = factory.MakeData(buf, pos); sect->Add(mem); pos = 0; } pc += n; } else { if (pos) { ObjMemory *mem = factory.MakeData(buf, pos); sect->Add(mem); pos = 0; } ObjExpression *t; try { t = ConvertExpression(f.GetExpr(), fil, factory); SwapSectionIntoPlace(t); } catch (std::runtime_error *e) { Errors::IncrementCount(); std::cout << "Error " << f.GetFileName().c_str() << "(" << f.GetErrorLine() << "):" << e->what() << std::endl; delete e; t = nullptr; rv = false; } if (t && f.IsRel()) { ObjExpression *left = factory.MakeExpression(f.GetRelOffs()); t = factory.MakeExpression(ObjExpression::eSub, t, left); left = factory.MakeExpression(ObjExpression::ePC); t = factory.MakeExpression(ObjExpression::eSub, t, left); } if (t) { ObjMemory *mem = factory.MakeFixup(t, f.GetSize()); if (mem) sect->Add(mem); } pc += f.GetSize(); } } if (pos) { ObjMemory *mem = factory.MakeData(buf, pos); sect->Add(mem); } } return rv; }