
This patch extends the MachO linker's map file generation to include branch extension thunk symbols. Previously, thunks were omitted from the map file, making it difficult to understand the final layout of the binary, especially when debugging issues related to long branch thunks. This change ensures thunks are included and correctly interleaved with other symbols based on their address, providing an accurate representation of the linked output.
104 lines
3.7 KiB
C++
104 lines
3.7 KiB
C++
//===- OutputSection.h ------------------------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLD_MACHO_OUTPUT_SECTION_H
|
|
#define LLD_MACHO_OUTPUT_SECTION_H
|
|
|
|
#include "Symbols.h"
|
|
#include "lld/Common/LLVM.h"
|
|
#include "llvm/ADT/DenseMap.h"
|
|
#include "llvm/ADT/TinyPtrVector.h"
|
|
|
|
#include <limits>
|
|
|
|
namespace lld::macho {
|
|
|
|
class Defined;
|
|
class InputSection;
|
|
class OutputSegment;
|
|
|
|
// The default order value for OutputSections that are not constructed from
|
|
// InputSections (i.e. SyntheticSections). We make it less than INT_MAX in order
|
|
// not to conflict with the ordering of zerofill sections, which must always be
|
|
// placed at the end of their segment.
|
|
constexpr int UnspecifiedInputOrder = std::numeric_limits<int>::max() - 1024;
|
|
|
|
// Output sections represent the finalized sections present within the final
|
|
// linked executable. They can represent special sections (like the symbol
|
|
// table), or represent coalesced sections from the various inputs given to the
|
|
// linker with the same segment / section name.
|
|
class OutputSection {
|
|
public:
|
|
enum Kind {
|
|
ConcatKind,
|
|
SyntheticKind,
|
|
TextKind,
|
|
};
|
|
|
|
OutputSection(Kind kind, StringRef name) : name(name), sectionKind(kind) {}
|
|
virtual ~OutputSection() = default;
|
|
Kind kind() const { return sectionKind; }
|
|
|
|
// These accessors will only be valid after finalizing the section.
|
|
uint64_t getSegmentOffset() const;
|
|
|
|
// How much space the section occupies in the address space.
|
|
virtual uint64_t getSize() const = 0;
|
|
// How much space the section occupies in the file. Most sections are copied
|
|
// as-is so their file size is the same as their address space size.
|
|
virtual uint64_t getFileSize() const { return getSize(); }
|
|
|
|
// Hidden sections omit header content, but body content may still be present.
|
|
virtual bool isHidden() const { return false; }
|
|
// Unneeded sections are omitted entirely (header and body).
|
|
virtual bool isNeeded() const { return true; }
|
|
|
|
// The implementations of this method can assume that it is only called right
|
|
// before addresses get assigned to this particular OutputSection. In
|
|
// particular, this means that it gets called only after addresses have been
|
|
// assigned to output sections that occur earlier in the output binary.
|
|
// Naturally, this means different sections' finalize() methods cannot execute
|
|
// concurrently with each other. As such, avoid using this method for
|
|
// operations that do not require this strict sequential guarantee.
|
|
//
|
|
// Operations that need to occur late in the linking process, but which do not
|
|
// need the sequential guarantee, should be named `finalizeContents()`. See
|
|
// e.g. LinkEditSection::finalizeContents() and
|
|
// CStringSection::finalizeContents().
|
|
virtual void finalize() {}
|
|
|
|
virtual void writeTo(uint8_t *buf) const = 0;
|
|
|
|
// Handle section$start$ and section$end$ symbols.
|
|
void assignAddressesToStartEndSymbols();
|
|
|
|
StringRef name;
|
|
llvm::TinyPtrVector<Defined *> sectionStartSymbols;
|
|
llvm::TinyPtrVector<Defined *> sectionEndSymbols;
|
|
OutputSegment *parent = nullptr;
|
|
// For output sections that don't have explicit ordering requirements, their
|
|
// output order should be based on the order of the input sections they
|
|
// contain.
|
|
int inputOrder = UnspecifiedInputOrder;
|
|
|
|
uint32_t index = 0;
|
|
uint64_t addr = 0;
|
|
uint64_t fileOff = 0;
|
|
uint32_t align = 1;
|
|
uint32_t flags = 0;
|
|
uint32_t reserved1 = 0;
|
|
uint32_t reserved2 = 0;
|
|
|
|
private:
|
|
Kind sectionKind;
|
|
};
|
|
|
|
} // namespace lld::macho
|
|
|
|
#endif
|