Пример #1
0
        public LinkerSymbol DefineSymbol(string name, SectionKind kind, int alignment, int size)
        {
            uint aligned = alignment != 0 ? (uint)alignment : 1;

            lock (_lock)
            {
                if (!symbolLookup.TryGetValue(name, out LinkerSymbol symbol))
                {
                    symbol = new LinkerSymbol(name, aligned, kind);

                    Symbols.Add(symbol);
                    symbolLookup.Add(name, symbol);
                    symbol.IsExternalSymbol = false;
                }

                symbol.Alignment   = aligned;
                symbol.SectionKind = kind;

                symbol.Stream = (size == 0) ? new MemoryStream() : new MemoryStream(size);

                if (size != 0)
                {
                    symbol.Stream.SetLength(size);
                }

                return(symbol);
            }
        }
Пример #2
0
 internal void SetFirst(LinkerSymbol symbol)
 {
     lock (mylock)
     {
         Symbols.Remove(symbol);
         Symbols.Insert(0, symbol);
     }
 }
Пример #3
0
        public void Link(LinkType linkType, PatchType patchType, LinkerSymbol patchSymbol, long patchOffset, LinkerSymbol referenceSymbol, int referenceOffset)
        {
            var linkRequest = new LinkRequest(linkType, patchType, patchSymbol, (int)patchOffset, referenceSymbol, referenceOffset);

            lock (_lock)
            {
                patchSymbol.AddPatch(linkRequest);
            }
        }
Пример #4
0
        public void Link(LinkType linkType, PatchType patchType, LinkerSymbol patchSymbol, int patchOffset, LinkerSymbol referenceSymbol, int referenceOffset)
        {
            lock (mylock)
            {
                var linkRequest = new LinkRequest(linkType, patchType, patchSymbol, patchOffset, referenceSymbol, referenceOffset);

                patchSymbol.AddPatch(linkRequest);
            }
        }
Пример #5
0
        /// <summary>
        /// Initializes a new instance of LinkRequest.
        /// </summary>
        /// <param name="linkType">Type of the link.</param>
        /// <param name="patchType">Type of the patch.</param>
        /// <param name="patchSymbol">The patch symbol.</param>
        /// <param name="patchOffset">The patch offset.</param>
        /// <param name="referenceSymbol">The reference symbol.</param>
        /// <param name="referenceOffset">The reference offset.</param>
        ///
        public LinkRequest(LinkType linkType, PatchType patchType, LinkerSymbol patchSymbol, int patchOffset, LinkerSymbol referenceSymbol, int referenceOffset)
        {
            Debug.Assert(patchSymbol != null);
            Debug.Assert(referenceSymbol != null);

            LinkType  = linkType;
            PatchType = patchType;

            PatchSymbol = patchSymbol;
            PatchOffset = patchOffset;

            ReferenceSymbol = referenceSymbol;
            ReferenceOffset = referenceOffset;
        }
Пример #6
0
        public LinkerSymbol GetSymbol(string name)
        {
            lock (_lock)
            {
                if (!symbolLookup.TryGetValue(name, out LinkerSymbol symbol))
                {
                    symbol = new LinkerSymbol(name);

                    Symbols.Add(symbol);
                    symbolLookup.Add(name, symbol);
                }

                return(symbol);
            }
        }
Пример #7
0
        public LinkerSymbol DefineExternalSymbol(string name, string externalName, SectionKind kind)
        {
            lock (_lock)
            {
                if (!symbolLookup.TryGetValue(name, out LinkerSymbol symbol))
                {
                    symbol = new LinkerSymbol(name, 0, kind);

                    Symbols.Add(symbol);
                    symbolLookup.Add(name, symbol);
                }

                symbol.SectionKind = kind;
                symbol.IsExport    = true;
                symbol.ExportName  = externalName;

                return(symbol);
            }
        }
Пример #8
0
        protected LinkerSymbol CreateSymbol(string name, SectionKind kind, uint alignment)
        {
            lock (mylock)
            {
                var section = LinkerSections[(int)kind];

                Debug.Assert(section != null);

                var symbol = section.GetSymbol(name);

                if (symbol == null)
                {
                    symbol = new LinkerSymbol(name, kind, alignment);

                    section.AddLinkerObject(symbol);
                }

                symbol.Alignment = alignment != 0 ? alignment : 1;

                return(symbol);
            }
        }
Пример #9
0
 public void SetFirst(LinkerSymbol symbol)
 {
     FirstSymbol = symbol;
 }
Пример #10
0
        public void Link(LinkType linkType, PatchType patchType, LinkerSymbol patchSymbol, long patchOffset, string referenceSymbolName, int referenceOffset)
        {
            var referenceObject = GetSymbol(referenceSymbolName);

            Link(linkType, patchType, patchSymbol, patchOffset, referenceObject, referenceOffset);
        }
Пример #11
0
 internal void AddLinkerObject(LinkerSymbol symbol)
 {
     Symbols.Add(symbol);
     symbolLookup.Add(symbol.Name, symbol);
 }
Пример #12
0
 public void SetFirst(LinkerSymbol symbol)
 {
     Symbols.Remove(symbol);
     Symbols.Insert(0, symbol);
 }
Пример #13
0
        public void SetFirst(LinkerSymbol symbol)
        {
            var section = LinkerSections[(int)symbol.SectionKind];

            section.SetFirst(symbol);
        }
Пример #14
0
        public void Link(LinkType linkType, PatchType patchType, LinkerSymbol patchSymbol, int patchOffset, SectionKind referenceKind, string referenceSymbolName, int referenceOffset)
        {
            var referenceObject = GetSymbol(referenceSymbolName, referenceKind);

            Link(linkType, patchType, patchSymbol, patchOffset, referenceObject, referenceOffset);
        }
Пример #15
0
        public void Link(LinkType linkType, PatchType patchType, SectionKind patchKind, string patchSymbolName, int patchOffset, LinkerSymbol referenceSymbol, int referenceOffset)
        {
            var patchObject = GetSymbol(patchSymbolName, patchKind);

            Link(linkType, patchType, patchObject, patchOffset, referenceSymbol, referenceOffset);
        }