Example #1
0
        public LinkedSectionPart add(LinkedLibrary library, uint sectionNumber)
        {
            LinkedSectionPart s = new LinkedSectionPart();

            s.section        = this;
            s.library        = library;
            s.librarySection = sectionNumber;
            while ((size % alignment) != 0)
            {
                size++;
            }
            s.startAddress = offset + size;
            s.size         = library.file.sectionVirtualSize(sectionNumber);
            size          += s.size;
            parts.Add(s);

            ulong foffset = library.file.sectionFileOffset(sectionNumber);
            ulong fsize   = library.file.sectionFileSize(sectionNumber);

            for (ulong i = 0; i < fsize; i++)
            {
                linker.target.setU8(s.startAddress + i, library.file.memory.getU8(foffset + i, false));
            }
            for (ulong j = fsize; j < s.size; j++)
            {
                linker.target.setU8(s.startAddress + j, 0); // Clear any remaining "virtual" (reserved) memory with zeroes
            }
            return(s);
        }
Example #2
0
        public LinkedLibrary add(LibraryFile library)
        {
            LinkedLibrary result = new LinkedLibrary();

            result.linker  = this;
            result.file    = library;
            result.symbols = new LinkedSymbol[library.nsymbols];
            for (uint i = 0; i < library.nsymbols; i++)
            {
                result.symbols[i]         = new LinkedSymbol();
                result.symbols[i].library = result;
                result.symbols[i].index   = i;
            }
            libraries.Add(result);

            for (uint i = 0; i < library.nsections; i++)
            {
                if (sections.ContainsKey(library.sectionName(i)))
                {
                    LinkedSection s = null;
                    sections.TryGetValue(library.sectionName(i), out s); // WTF? Why doesn't "Get"/"GetValue" work?
                    result.add(s.add(result, i));
                }
            }

            return(result);
        }