Revert "[ORC] Add automatic shared library resolver for unresolved symbols." (#163943)

Reverts llvm/llvm-project#148410

Reverting this change due to a few buildbot/test failures. Will
investigate and reapply once the issues are resolved.
This commit is contained in:
SahilPatidar 2025-10-17 17:17:10 +05:30 committed by GitHub
parent e40f215573
commit 8db1aabf8b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
18 changed files with 0 additions and 9783 deletions

View File

@ -1,173 +0,0 @@
//===- SymbolFilter.h - Utilities for Symbol Filtering ---------*- 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 LLVM_EXECUTIONENGINE_ORC_SHARED_SYMBOLFILTER_H
#define LLVM_EXECUTIONENGINE_ORC_SHARED_SYMBOLFILTER_H
#include "llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h"
#include <cmath>
#include <type_traits>
#include <vector>
namespace llvm {
namespace orc {
namespace shared {
using SPSBloomFilter =
SPSTuple<bool, uint32_t, uint32_t, uint32_t, SPSSequence<uint64_t>>;
}
class BloomFilter {
public:
using HashFunc = std::function<uint32_t(StringRef)>;
BloomFilter() = default;
BloomFilter(BloomFilter &&) noexcept = default;
BloomFilter &operator=(BloomFilter &&) noexcept = default;
BloomFilter(const BloomFilter &) = delete;
BloomFilter &operator=(const BloomFilter &) = delete;
BloomFilter(uint32_t SymbolCount, float FalsePositiveRate, HashFunc hashFn)
: HashFn(std::move(hashFn)) {
initialize(SymbolCount, FalsePositiveRate);
}
bool isInitialized() const { return Initialized; }
void add(StringRef Sym) {
assert(Initialized);
addHash(HashFn(Sym));
}
bool mayContain(StringRef Sym) const {
return !isEmpty() && testHash(HashFn(Sym));
}
bool isEmpty() const { return SymbolCount == 0; }
private:
friend class shared::SPSSerializationTraits<shared::SPSBloomFilter,
BloomFilter>;
static constexpr uint32_t BitsPerEntry = 64;
bool Initialized = false;
uint32_t SymbolCount = 0;
uint32_t BloomSize = 0;
uint32_t BloomShift = 0;
std::vector<uint64_t> BloomTable;
HashFunc HashFn;
void initialize(uint32_t SymCount, float FalsePositiveRate) {
assert(SymCount > 0);
SymbolCount = SymCount;
Initialized = true;
float ln2 = std::log(2.0f);
float M = -1.0f * SymbolCount * std::log(FalsePositiveRate) / (ln2 * ln2);
BloomSize = static_cast<uint32_t>(std::ceil(M / BitsPerEntry));
BloomShift = std::min(6u, log2ceil(SymbolCount));
BloomTable.resize(BloomSize, 0);
}
void addHash(uint32_t Hash) {
uint32_t Hash2 = Hash >> BloomShift;
uint32_t N = (Hash / BitsPerEntry) % BloomSize;
uint64_t Mask =
(1ULL << (Hash % BitsPerEntry)) | (1ULL << (Hash2 % BitsPerEntry));
BloomTable[N] |= Mask;
}
bool testHash(uint32_t Hash) const {
uint32_t Hash2 = Hash >> BloomShift;
uint32_t N = (Hash / BitsPerEntry) % BloomSize;
uint64_t Mask =
(1ULL << (Hash % BitsPerEntry)) | (1ULL << (Hash2 % BitsPerEntry));
return (BloomTable[N] & Mask) == Mask;
}
static constexpr uint32_t log2ceil(uint32_t V) {
return V <= 1 ? 0 : 32 - countl_zero(V - 1);
}
};
class BloomFilterBuilder {
public:
using HashFunc = BloomFilter::HashFunc;
BloomFilterBuilder() = default;
BloomFilterBuilder &setFalsePositiveRate(float Rate) {
assert(Rate > 0.0f && Rate < 1.0f);
FalsePositiveRate = Rate;
return *this;
}
BloomFilterBuilder &setHashFunction(HashFunc Fn) {
HashFn = std::move(Fn);
return *this;
}
BloomFilter build(ArrayRef<StringRef> Symbols) const {
assert(!Symbols.empty() && "Cannot build filter from empty symbol list.");
BloomFilter F(static_cast<uint32_t>(Symbols.size()), FalsePositiveRate,
HashFn);
for (const auto &Sym : Symbols)
F.add(Sym);
return F;
}
private:
float FalsePositiveRate = 0.02f;
HashFunc HashFn = [](StringRef S) -> uint32_t {
uint32_t H = 5381;
for (char C : S)
H = ((H << 5) + H) + static_cast<uint8_t>(C); // H * 33 + C
return H;
};
};
namespace shared {
template <> class SPSSerializationTraits<SPSBloomFilter, BloomFilter> {
public:
static size_t size(const BloomFilter &Filter) {
return SPSBloomFilter::AsArgList::size(
Filter.Initialized, Filter.SymbolCount, Filter.BloomSize,
Filter.BloomShift, Filter.BloomTable);
}
static bool serialize(SPSOutputBuffer &OB, const BloomFilter &Filter) {
return SPSBloomFilter::AsArgList::serialize(
OB, Filter.Initialized, Filter.SymbolCount, Filter.BloomSize,
Filter.BloomShift, Filter.BloomTable);
}
static bool deserialize(SPSInputBuffer &IB, BloomFilter &Filter) {
bool IsInitialized;
uint32_t SymbolCount = 0, BloomSize = 0, BloomShift = 0;
std::vector<uint64_t> BloomTable;
if (!SPSBloomFilter::AsArgList::deserialize(
IB, IsInitialized, SymbolCount, BloomSize, BloomShift, BloomTable))
return false;
Filter.Initialized = IsInitialized;
Filter.SymbolCount = SymbolCount;
Filter.BloomSize = BloomSize;
Filter.BloomShift = BloomShift;
Filter.BloomTable = std::move(BloomTable);
return true;
}
};
} // end namespace shared
} // end namespace orc
} // end namespace llvm
#endif // LLVM_EXECUTIONENGINE_ORC_SHARED_SYMBOLFILTER_H

View File

@ -1,514 +0,0 @@
//===- LibraryResolver.h - Automatic Library Symbol Resolution -*- 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
//
//===----------------------------------------------------------------------===//
//
// This file provides support for automatically searching symbols across
// dynamic libraries that have not yet been loaded.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_EXECUTIONENGINE_ORC_TARGETPROCESS_LIBRARYRESOLVER_H
#define LLVM_EXECUTIONENGINE_ORC_TARGETPROCESS_LIBRARYRESOLVER_H
#include "llvm/ADT/FunctionExtras.h"
#include "llvm/ExecutionEngine/Orc/Shared/SymbolFilter.h"
#include "llvm/ExecutionEngine/Orc/TargetProcess/LibraryScanner.h"
#include "llvm/Support/Path.h"
#include <atomic>
#include <shared_mutex>
#include <unordered_map>
namespace llvm {
namespace orc {
/// Manages library metadata and state for symbol resolution.
///
/// Tracks libraries by load state and kind (user/system), and stores
/// associated Bloom filters and hash maps to speed up symbol lookups.
/// Thread-safe for concurrent access.
class LibraryManager {
public:
enum class LibState : uint8_t { Unloaded = 0, Loaded = 1, Queried = 2 };
class LibraryInfo {
public:
LibraryInfo(const LibraryInfo &) = delete;
LibraryInfo &operator=(const LibraryInfo &) = delete;
LibraryInfo(std::string FilePath, LibState S, PathType K,
std::optional<BloomFilter> Filter = std::nullopt)
: FilePath(std::move(FilePath)), S(S), K(K), Filter(std::move(Filter)) {
}
StringRef getBasePath() const { return sys::path::parent_path(FilePath); }
StringRef getFileName() const { return sys::path::filename(FilePath); }
std::string getFullPath() const { return FilePath; }
bool setFilter(BloomFilter F) {
std::lock_guard<std::shared_mutex> Lock(Mtx);
if (Filter)
return false;
Filter.emplace(std::move(F));
return true;
}
bool ensureFilterBuilt(const BloomFilterBuilder &FB,
ArrayRef<StringRef> Symbols) {
std::lock_guard<std::shared_mutex> Lock(Mtx);
if (Filter)
return false;
Filter.emplace(FB.build(Symbols));
return true;
}
bool mayContain(StringRef Symbol) const {
assert(hasFilter());
std::shared_lock<std::shared_mutex> Lock(Mtx);
return Filter->mayContain(Symbol);
}
bool hasFilter() const {
std::shared_lock<std::shared_mutex> Lock(Mtx);
return Filter.has_value();
}
LibState getState() const { return S.load(); }
PathType getKind() const { return K; }
void setState(LibState s) { S.store(s); }
bool operator==(const LibraryInfo &other) const {
return FilePath == other.FilePath;
}
private:
std::string FilePath;
std::atomic<LibState> S;
PathType K;
std::optional<BloomFilter> Filter;
mutable std::shared_mutex Mtx;
};
/// A read-only view of libraries filtered by state and kind.
///
/// Lets you loop over only the libraries in a map that match a given State
/// and PathType.
class FilteredView {
public:
using Map = StringMap<std::shared_ptr<LibraryInfo>>;
using Iterator = typename Map::const_iterator;
class FilterIterator {
public:
FilterIterator(Iterator it_, Iterator end_, LibState S, PathType K)
: it(it_), end(end_), S(S), K(K) {
advance();
}
bool operator!=(const FilterIterator &other) const {
return it != other.it;
}
const std::shared_ptr<LibraryInfo> &operator*() const {
return it->second;
}
FilterIterator &operator++() {
++it;
advance();
return *this;
}
private:
void advance() {
for (; it != end; ++it)
if (it->second->getState() == S && it->second->getKind() == K)
break;
}
Iterator it;
Iterator end;
LibState S;
PathType K;
};
FilteredView(Iterator begin, Iterator end, LibState s, PathType k)
: mapBegin(begin), mapEnd(end), state(s), kind(k) {}
FilterIterator begin() const {
return FilterIterator(mapBegin, mapEnd, state, kind);
}
FilterIterator end() const {
return FilterIterator(mapEnd, mapEnd, state, kind);
}
private:
Iterator mapBegin;
Iterator mapEnd;
LibState state;
PathType kind;
};
private:
StringMap<std::shared_ptr<LibraryInfo>> Libraries;
mutable std::shared_mutex Mtx;
public:
using LibraryVisitor = std::function<bool(const LibraryInfo &)>;
LibraryManager() = default;
~LibraryManager() = default;
bool addLibrary(std::string Path, PathType Kind,
std::optional<BloomFilter> Filter = std::nullopt) {
std::unique_lock<std::shared_mutex> Lock(Mtx);
if (Libraries.count(Path) > 0)
return false;
Libraries.insert({std::move(Path),
std::make_shared<LibraryInfo>(Path, LibState::Unloaded,
Kind, std::move(Filter))});
return true;
}
bool hasLibrary(StringRef Path) const {
std::shared_lock<std::shared_mutex> Lock(Mtx);
if (Libraries.count(Path) > 0)
return true;
return false;
}
bool removeLibrary(StringRef Path) {
std::unique_lock<std::shared_mutex> Lock(Mtx);
auto I = Libraries.find(Path);
if (I == Libraries.end())
return false;
Libraries.erase(I);
return true;
}
void markLoaded(StringRef Path) {
std::unique_lock<std::shared_mutex> Lock(Mtx);
if (auto It = Libraries.find(Path); It != Libraries.end())
It->second->setState(LibState::Loaded);
}
void markQueried(StringRef Path) {
std::unique_lock<std::shared_mutex> Lock(Mtx);
if (auto It = Libraries.find(Path); It != Libraries.end())
It->second->setState(LibState::Queried);
}
std::shared_ptr<LibraryInfo> getLibrary(StringRef Path) {
std::shared_lock<std::shared_mutex> Lock(Mtx);
if (auto It = Libraries.find(Path); It != Libraries.end())
return It->second;
return nullptr;
}
FilteredView getView(LibState S, PathType K) const {
std::shared_lock<std::shared_mutex> Lock(Mtx);
return FilteredView(Libraries.begin(), Libraries.end(), S, K);
}
void forEachLibrary(const LibraryVisitor &visitor) const {
std::unique_lock<std::shared_mutex> Lock(Mtx);
for (const auto &[_, entry] : Libraries) {
if (!visitor(*entry))
break;
}
}
bool isLoaded(StringRef Path) const {
std::unique_lock<std::shared_mutex> Lock(Mtx);
if (auto It = Libraries.find(Path.str()); It != Libraries.end())
return It->second->getState() == LibState::Loaded;
return false;
}
bool isQueried(StringRef Path) const {
std::unique_lock<std::shared_mutex> Lock(Mtx);
if (auto It = Libraries.find(Path.str()); It != Libraries.end())
return It->second->getState() == LibState::Queried;
return false;
}
void clear() {
std::unique_lock<std::shared_mutex> Lock(Mtx);
Libraries.clear();
}
};
using LibraryInfo = LibraryManager::LibraryInfo;
struct SearchPlanEntry {
LibraryManager::LibState State; // Loaded, Queried, Unloaded
PathType Type; // User, System
};
struct SearchPolicy {
std::vector<SearchPlanEntry> Plan;
static SearchPolicy defaultPlan() {
return {{{LibraryManager::LibState::Loaded, PathType::User},
{LibraryManager::LibState::Queried, PathType::User},
{LibraryManager::LibState::Unloaded, PathType::User},
{LibraryManager::LibState::Loaded, PathType::System},
{LibraryManager::LibState::Queried, PathType::System},
{LibraryManager::LibState::Unloaded, PathType::System}}};
}
};
struct SymbolEnumeratorOptions {
enum Filter : uint32_t {
None = 0,
IgnoreUndefined = 1 << 0,
IgnoreWeak = 1 << 1,
IgnoreIndirect = 1 << 2,
IgnoreHidden = 1 << 3,
IgnoreNonGlobal = 1 << 4
};
static SymbolEnumeratorOptions defaultOptions() {
return {Filter::IgnoreUndefined | Filter::IgnoreWeak |
Filter::IgnoreIndirect};
}
uint32_t FilterFlags = Filter::None;
};
struct SearchConfig {
SearchPolicy Policy;
SymbolEnumeratorOptions Options;
SearchConfig()
: Policy(SearchPolicy::defaultPlan()), // default plan
Options(SymbolEnumeratorOptions::defaultOptions()) {}
};
/// Scans libraries and resolves Symbols across user and system paths.
///
/// Supports symbol enumeration and filtering via SymbolEnumerator, and tracks
/// symbol resolution results through SymbolQuery. Thread-safe and uses
/// LibraryScanHelper for efficient path resolution and caching.
class LibraryResolver {
friend class LibraryResolutionDriver;
public:
class SymbolEnumerator {
public:
enum class EnumerateResult { Continue, Stop, Error };
using OnEachSymbolFn = std::function<EnumerateResult(StringRef Sym)>;
static bool enumerateSymbols(StringRef Path, OnEachSymbolFn OnEach,
const SymbolEnumeratorOptions &Opts);
};
/// Tracks a set of symbols and the libraries where they are resolved.
///
/// SymbolQuery is used to keep track of which symbols have been resolved
/// to which libraries. It supports concurrent read/write access using a
/// shared mutex, allowing multiple readers or a single writer at a time.
class SymbolQuery {
public:
/// Holds the result for a single symbol.
struct Result {
std::string Name;
std::string ResolvedLibPath;
};
private:
mutable std::shared_mutex Mtx;
StringMap<Result> Results;
std::atomic<size_t> ResolvedCount = 0;
public:
explicit SymbolQuery(const std::vector<std::string> &Symbols) {
for (const auto &s : Symbols) {
if (!Results.contains(s))
Results.insert({s, Result{s, ""}});
}
}
SmallVector<StringRef> getUnresolvedSymbols() const {
SmallVector<StringRef> Unresolved;
std::shared_lock<std::shared_mutex> Lock(Mtx);
for (const auto &[name, res] : Results) {
if (res.ResolvedLibPath.empty())
Unresolved.push_back(name);
}
return Unresolved;
}
void resolve(StringRef Sym, const std::string &LibPath) {
std::unique_lock<std::shared_mutex> Lock(Mtx);
auto It = Results.find(Sym);
if (It != Results.end() && It->second.ResolvedLibPath.empty()) {
It->second.ResolvedLibPath = LibPath;
ResolvedCount.fetch_add(1, std::memory_order_relaxed);
}
}
bool allResolved() const {
return ResolvedCount.load(std::memory_order_relaxed) == Results.size();
}
bool hasUnresolved() const {
return ResolvedCount.load(std::memory_order_relaxed) < Results.size();
}
std::optional<StringRef> getResolvedLib(StringRef Sym) const {
std::shared_lock<std::shared_mutex> Lock(Mtx);
auto It = Results.find(Sym);
if (It != Results.end() && !It->second.ResolvedLibPath.empty())
return StringRef(It->second.ResolvedLibPath);
return std::nullopt;
}
bool isResolved(StringRef Sym) const {
std::shared_lock<std::shared_mutex> Lock(Mtx);
auto It = Results.find(Sym.str());
return It != Results.end() && !It->second.ResolvedLibPath.empty();
}
std::vector<const Result *> getAllResults() const {
std::shared_lock<std::shared_mutex> Lock(Mtx);
std::vector<const Result *> Out;
Out.reserve(Results.size());
for (const auto &[_, res] : Results)
Out.push_back(&res);
return Out;
}
};
struct Setup {
std::vector<std::string> BasePaths;
std::shared_ptr<LibraryPathCache> Cache;
std::shared_ptr<PathResolver> PResolver;
size_t ScanBatchSize = 0;
LibraryScanner::ShouldScanFn ShouldScanCall = [](StringRef) {
return true;
};
BloomFilterBuilder FilterBuilder = BloomFilterBuilder();
static Setup
create(std::vector<std::string> BasePaths,
std::shared_ptr<LibraryPathCache> existingCache = nullptr,
std::shared_ptr<PathResolver> existingResolver = nullptr,
LibraryScanner::ShouldScanFn customShouldScan = nullptr) {
Setup S;
S.BasePaths = std::move(BasePaths);
S.Cache =
existingCache ? existingCache : std::make_shared<LibraryPathCache>();
S.PResolver = existingResolver ? existingResolver
: std::make_shared<PathResolver>(S.Cache);
if (customShouldScan)
S.ShouldScanCall = std::move(customShouldScan);
return S;
}
};
LibraryResolver() = delete;
explicit LibraryResolver(const Setup &S);
~LibraryResolver() = default;
using OnSearchComplete = unique_function<void(SymbolQuery &)>;
void dump() {
int i = 0;
LibMgr.forEachLibrary([&](const LibraryInfo &Lib) -> bool {
dbgs() << ++i << ". Library Path : " << Lib.getFullPath() << " -> \n\t\t:"
<< " ({Type : ("
<< (Lib.getKind() == PathType::User ? "User" : "System")
<< ") }, { State : "
<< (Lib.getState() == LibraryManager::LibState::Loaded
? "Loaded"
: "Unloaded")
<< "})\n";
return true;
});
}
void searchSymbolsInLibraries(std::vector<std::string> &SymList,
OnSearchComplete OnComplete,
const SearchConfig &Config = SearchConfig());
private:
bool scanLibrariesIfNeeded(PathType K, size_t BatchSize = 0);
void resolveSymbolsInLibrary(LibraryInfo &Lib, SymbolQuery &Q,
const SymbolEnumeratorOptions &Opts);
bool
symbolExistsInLibrary(const LibraryInfo &Lib, StringRef Sym,
std::vector<std::string> *MatchedSymbols = nullptr);
bool symbolExistsInLibrary(const LibraryInfo &Lib, StringRef SymName,
std::vector<std::string> *AllSymbols,
const SymbolEnumeratorOptions &Opts);
std::shared_ptr<LibraryPathCache> LibPathCache;
std::shared_ptr<PathResolver> LibPathResolver;
LibraryScanHelper ScanHelper;
BloomFilterBuilder FB;
LibraryManager LibMgr;
LibraryScanner::ShouldScanFn ShouldScanCall;
size_t scanBatchSize;
};
using SymbolEnumerator = LibraryResolver::SymbolEnumerator;
using SymbolQuery = LibraryResolver::SymbolQuery;
using EnumerateResult = SymbolEnumerator::EnumerateResult;
class LibraryResolutionDriver {
public:
static std::unique_ptr<LibraryResolutionDriver>
create(const LibraryResolver::Setup &S);
void addScanPath(const std::string &Path, PathType Kind);
bool markLibraryLoaded(StringRef Path);
bool markLibraryUnLoaded(StringRef Path);
bool isLibraryLoaded(StringRef Path) const {
return LR->LibMgr.isLoaded(Path);
}
void resetAll() {
LR->LibMgr.clear();
LR->ScanHelper.resetToScan();
LR->LibPathCache->clear();
}
void scanAll(size_t BatchSize = 0) {
LR->scanLibrariesIfNeeded(PathType::User, BatchSize);
LR->scanLibrariesIfNeeded(PathType::System, BatchSize);
}
void scan(PathType PK, size_t BatchSize = 0) {
LR->scanLibrariesIfNeeded(PK, BatchSize);
}
void resolveSymbols(std::vector<std::string> Symbols,
LibraryResolver::OnSearchComplete OnCompletion,
const SearchConfig &Config = SearchConfig());
~LibraryResolutionDriver() = default;
private:
LibraryResolutionDriver(std::unique_ptr<LibraryResolver> L)
: LR(std::move(L)) {}
std::unique_ptr<LibraryResolver> LR;
};
} // end namespace orc
} // end namespace llvm
#endif // LLVM_EXECUTIONENGINE_ORC_TARGETPROCESS_LIBRARYRESOLVER_H

View File

@ -1,474 +0,0 @@
//===- LibraryScanner.h - Scanner for Shared Libraries ---------*- 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
//
//===----------------------------------------------------------------------===//
//
// This file provides functionality for scanning dynamic (shared) libraries.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_EXECUTIONENGINE_ORC_TARGETPROCESS_LIBRARYSCANNER_H
#define LLVM_EXECUTIONENGINE_ORC_TARGETPROCESS_LIBRARYSCANNER_H
#include "llvm/ADT/FunctionExtras.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/Object/ObjectFile.h"
#include "llvm/Support/Allocator.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/StringSaver.h"
#include <atomic>
#include <mutex>
#include <queue>
#include <shared_mutex>
#include <string>
#include <unordered_map>
#include <unordered_set>
namespace llvm {
namespace orc {
class LibraryManager;
class LibraryPathCache {
friend class PathResolver;
public:
LibraryPathCache() = default;
void clear(bool isRealPathCache = false) {
std::unique_lock<std::shared_mutex> lock(Mtx);
Seen.clear();
if (isRealPathCache) {
RealPathCache.clear();
#ifndef _WIN32
ReadlinkCache.clear();
LstatCache.clear();
#endif
}
}
void markSeen(const std::string &CanonPath) {
std::unique_lock<std::shared_mutex> lock(Mtx);
Seen.insert(CanonPath);
}
bool hasSeen(StringRef CanonPath) const {
std::shared_lock<std::shared_mutex> lock(Mtx);
return Seen.contains(CanonPath);
}
bool hasSeenOrMark(StringRef CanonPath) {
std::string s = CanonPath.str();
{
std::shared_lock<std::shared_mutex> lock(Mtx);
if (Seen.contains(s))
return true;
}
{
std::unique_lock<std::shared_mutex> lock(Mtx);
Seen.insert(s);
}
return false;
}
private:
mutable std::shared_mutex Mtx;
struct PathInfo {
std::string canonicalPath;
std::error_code ErrnoCode;
};
void insert_realpath(StringRef Path, const PathInfo &Info) {
std::unique_lock<std::shared_mutex> lock(Mtx);
RealPathCache.insert({Path, Info});
}
std::optional<PathInfo> read_realpath(StringRef Path) const {
std::shared_lock<std::shared_mutex> lock(Mtx);
auto It = RealPathCache.find(Path);
if (It != RealPathCache.end())
return It->second;
return std::nullopt;
}
StringSet<> Seen;
StringMap<PathInfo> RealPathCache;
#ifndef _WIN32
StringMap<std::string> ReadlinkCache;
StringMap<mode_t> LstatCache;
void insert_link(StringRef Path, const std::string &s) {
std::unique_lock<std::shared_mutex> lock(Mtx);
ReadlinkCache.insert({Path, s});
}
std::optional<std::string> read_link(StringRef Path) const {
std::shared_lock<std::shared_mutex> lock(Mtx);
auto It = ReadlinkCache.find(Path);
if (It != ReadlinkCache.end())
return It->second;
return std::nullopt;
}
void insert_lstat(StringRef Path, mode_t m) {
std::unique_lock<std::shared_mutex> lock(Mtx);
LstatCache.insert({Path, m});
}
std::optional<mode_t> read_lstat(StringRef Path) const {
std::shared_lock<std::shared_mutex> lock(Mtx);
auto It = LstatCache.find(Path);
if (It != LstatCache.end())
return It->second;
return std::nullopt;
}
#endif
};
/// Resolves file system paths with optional caching of results.
///
/// Supports lstat, readlink, and realpath operations. Can resolve paths
/// relative to a base and handle symbolic links. Caches results to reduce
/// repeated system calls when enabled.
class PathResolver {
private:
std::shared_ptr<LibraryPathCache> LibPathCache;
public:
PathResolver(std::shared_ptr<LibraryPathCache> cache)
: LibPathCache(std::move(cache)) {}
std::optional<std::string> resolve(StringRef Path, std::error_code &ec) {
return realpathCached(Path, ec);
}
#ifndef _WIN32
mode_t lstatCached(StringRef Path);
std::optional<std::string> readlinkCached(StringRef Path);
#endif
std::optional<std::string> realpathCached(StringRef Path, std::error_code &ec,
StringRef base = "",
bool baseIsResolved = false,
long symloopLevel = 40);
};
/// Performs placeholder substitution in dynamic library paths.
///
/// Configures known placeholders (like @loader_path) and replaces them
/// in input paths with their resolved values.
class DylibSubstitutor {
public:
void configure(StringRef loaderPath);
std::string substitute(StringRef input) const {
for (const auto &[ph, value] : Placeholders) {
if (input.starts_with_insensitive(ph))
return (Twine(value) + input.drop_front(ph.size())).str();
}
return input.str();
}
private:
StringMap<std::string> Placeholders;
};
/// Validates and normalizes dynamic library paths.
///
/// Uses a `PathResolver` to resolve paths to their canonical form and
/// checks whether they point to valid shared libraries.
class DylibPathValidator {
public:
DylibPathValidator(PathResolver &PR) : LibPathResolver(PR) {}
static bool isSharedLibrary(StringRef Path);
std::optional<std::string> normalize(StringRef Path) const {
std::error_code ec;
auto real = LibPathResolver.resolve(Path, ec);
if (!real || ec)
return std::nullopt;
return real;
}
/// Validate the given path as a shared library.
std::optional<std::string> validate(StringRef Path) const {
auto realOpt = normalize(Path);
if (!realOpt)
return std::nullopt;
if (!isSharedLibrary(*realOpt))
return std::nullopt;
return realOpt;
}
private:
PathResolver &LibPathResolver;
};
enum class SearchPathType {
RPath,
UsrOrSys,
RunPath,
};
struct SearchPathConfig {
ArrayRef<StringRef> Paths;
SearchPathType type;
};
class SearchPathResolver {
public:
SearchPathResolver(const SearchPathConfig &Cfg,
StringRef PlaceholderPrefix = "")
: Kind(Cfg.type), PlaceholderPrefix(PlaceholderPrefix) {
for (auto &path : Cfg.Paths)
Paths.emplace_back(path.str());
}
std::optional<std::string> resolve(StringRef libStem,
const DylibSubstitutor &Subst,
DylibPathValidator &Validator) const;
SearchPathType searchPathType() const { return Kind; }
private:
std::vector<std::string> Paths;
SearchPathType Kind;
std::string PlaceholderPrefix;
};
class DylibResolverImpl {
public:
DylibResolverImpl(DylibSubstitutor Substitutor, DylibPathValidator &Validator,
std::vector<SearchPathResolver> Resolvers)
: Substitutor(std::move(Substitutor)), Validator(Validator),
Resolvers(std::move(Resolvers)) {}
std::optional<std::string> resolve(StringRef Stem,
bool VariateLibStem = false) const;
private:
std::optional<std::string> tryWithExtensions(StringRef libstem) const;
DylibSubstitutor Substitutor;
DylibPathValidator &Validator;
std::vector<SearchPathResolver> Resolvers;
};
class DylibResolver {
public:
DylibResolver(DylibPathValidator &Validator) : Validator(Validator) {}
void configure(StringRef loaderPath,
ArrayRef<SearchPathConfig> SearchPathCfg) {
DylibSubstitutor Substitutor;
Substitutor.configure(loaderPath);
std::vector<SearchPathResolver> Resolvers;
for (const auto &cfg : SearchPathCfg) {
Resolvers.emplace_back(cfg,
cfg.type == SearchPathType::RPath ? "@rpath" : "");
}
impl_ = std::make_unique<DylibResolverImpl>(
std::move(Substitutor), Validator, std::move(Resolvers));
}
std::optional<std::string> resolve(StringRef libStem,
bool VariateLibStem = false) const {
if (!impl_)
return std::nullopt;
return impl_->resolve(libStem, VariateLibStem);
}
static std::string resolvelinkerFlag(StringRef libStem,
StringRef loaderPath) {
DylibSubstitutor Substitutor;
Substitutor.configure(loaderPath);
return Substitutor.substitute(libStem);
}
private:
DylibPathValidator &Validator;
std::unique_ptr<DylibResolverImpl> impl_;
};
enum class PathType : uint8_t { User, System, Unknown };
enum class ScanState : uint8_t { NotScanned, Scanning, Scanned };
struct LibrarySearchPath {
std::string BasePath; // Canonical base directory path
PathType Kind; // User or System
std::atomic<ScanState> State;
LibrarySearchPath(std::string Base, PathType K)
: BasePath(std::move(Base)), Kind(K), State(ScanState::NotScanned) {}
};
/// Scans and tracks libraries for symbol resolution.
///
/// Maintains a list of library paths to scan, caches scanned units,
/// and resolves paths canonically for consistent tracking.
class LibraryScanHelper {
public:
explicit LibraryScanHelper(const std::vector<std::string> &SPaths,
std::shared_ptr<LibraryPathCache> LibPathCache,
std::shared_ptr<PathResolver> LibPathResolver)
: LibPathCache(std::move(LibPathCache)),
LibPathResolver(std::move(LibPathResolver)) {
DEBUG_WITH_TYPE(
"orc", dbgs() << "LibraryScanHelper::LibraryScanHelper: base paths : "
<< SPaths.size() << "\n";);
for (const auto &p : SPaths)
addBasePath(p);
}
void
addBasePath(const std::string &P,
PathType Kind =
PathType::Unknown); // Add a canonical directory for scanning
std::vector<std::shared_ptr<LibrarySearchPath>>
getNextBatch(PathType Kind, size_t batchSize);
bool leftToScan(PathType K) const;
void resetToScan();
bool isTrackedBasePath(StringRef P) const;
std::vector<std::shared_ptr<LibrarySearchPath>> getAllUnits() const;
SmallVector<StringRef> getSearchPaths() const {
SmallVector<StringRef> SearchPaths;
for (const auto &[_, SP] : LibSearchPaths)
SearchPaths.push_back(SP->BasePath);
return SearchPaths;
}
PathResolver &getPathResolver() const { return *LibPathResolver; }
LibraryPathCache &getCache() const { return *LibPathCache; }
bool hasSeenOrMark(StringRef P) const {
return LibPathCache->hasSeenOrMark(P);
}
std::optional<std::string> resolve(StringRef P, std::error_code &ec) const {
return LibPathResolver->resolve(P.str(), ec);
}
private:
std::string resolveCanonical(StringRef P, std::error_code &ec) const;
PathType classifyKind(StringRef P) const;
mutable std::shared_mutex Mtx;
std::shared_ptr<LibraryPathCache> LibPathCache;
std::shared_ptr<PathResolver> LibPathResolver;
StringMap<std::shared_ptr<LibrarySearchPath>>
LibSearchPaths; // key: canonical path
std::deque<StringRef> UnscannedUsr;
std::deque<StringRef> UnscannedSys;
};
/// Loads an object file and provides access to it.
///
/// Owns the underlying `ObjectFile` and ensures it is valid.
/// Any errors encountered during construction are stored and
/// returned when attempting to access the file.
class ObjectFileLoader {
public:
/// Construct an object file loader from the given path.
explicit ObjectFileLoader(StringRef Path) {
auto ObjOrErr = loadObjectFileWithOwnership(Path);
if (ObjOrErr)
Obj = std::move(*ObjOrErr);
else {
consumeError(std::move(Err));
Err = ObjOrErr.takeError();
}
}
ObjectFileLoader(const ObjectFileLoader &) = delete;
ObjectFileLoader &operator=(const ObjectFileLoader &) = delete;
ObjectFileLoader(ObjectFileLoader &&) = default;
ObjectFileLoader &operator=(ObjectFileLoader &&) = default;
/// Get the loaded object file, or return an error if loading failed.
Expected<object::ObjectFile &> getObjectFile() {
if (Err)
return std::move(Err);
return *Obj.getBinary();
}
static bool isArchitectureCompatible(const object::ObjectFile &Obj);
private:
object::OwningBinary<object::ObjectFile> Obj;
Error Err = Error::success();
static Expected<object::OwningBinary<object::ObjectFile>>
loadObjectFileWithOwnership(StringRef FilePath);
};
/// Scans libraries, resolves dependencies, and registers them.
class LibraryScanner {
public:
using ShouldScanFn = std::function<bool(StringRef)>;
LibraryScanner(
LibraryScanHelper &H, LibraryManager &LibMgr,
ShouldScanFn ShouldScanCall = [](StringRef path) { return true; })
: ScanHelper(H), LibMgr(LibMgr),
ShouldScanCall(std::move(ShouldScanCall)) {}
void scanNext(PathType Kind, size_t batchSize = 1);
/// Dependency info for a library.
struct LibraryDepsInfo {
llvm::BumpPtrAllocator Alloc;
llvm::StringSaver Saver{Alloc};
SmallVector<StringRef, 2> rpath;
SmallVector<StringRef, 2> runPath;
SmallVector<StringRef, 4> deps;
bool isPIE = false;
void addRPath(StringRef s) { rpath.push_back(Saver.save(s)); }
void addRunPath(StringRef s) { runPath.push_back(Saver.save(s)); }
void addDep(StringRef s) { deps.push_back(Saver.save(s)); }
};
private:
LibraryScanHelper &ScanHelper;
LibraryManager &LibMgr;
ShouldScanFn ShouldScanCall;
std::optional<std::string> shouldScan(StringRef FilePath);
Expected<LibraryDepsInfo> extractDeps(StringRef FilePath);
void handleLibrary(StringRef P, PathType K, int level = 1);
void scanBaseDir(std::shared_ptr<LibrarySearchPath> U);
};
using LibraryDepsInfo = LibraryScanner::LibraryDepsInfo;
} // end namespace orc
} // end namespace llvm
#endif // LLVM_EXECUTIONENGINE_ORC_TARGETPROCESS_LIBRARYSCANNER_H

View File

@ -16,11 +16,9 @@ add_llvm_component_library(LLVMOrcTargetProcess
ExecutorSharedMemoryMapperService.cpp
DefaultHostBootstrapValues.cpp
ExecutorResolver.cpp
LibraryResolver.cpp
JITLoaderGDB.cpp
JITLoaderPerf.cpp
JITLoaderVTune.cpp
LibraryScanner.cpp
OrcRTBootstrap.cpp
RegisterEHFrames.cpp
SimpleExecutorDylibManager.cpp

View File

@ -1,369 +0,0 @@
//===- LibraryResolver.cpp - Library Resolution of Unresolved Symbols ---===//
//
// 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
//
//===----------------------------------------------------------------------===//
//
// Library resolution impl for unresolved symbols
//
//===----------------------------------------------------------------------===//
#include "llvm/ExecutionEngine/Orc/TargetProcess/LibraryResolver.h"
#include "llvm/ExecutionEngine/Orc/TargetProcess/LibraryScanner.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/BinaryFormat/MachO.h"
#include "llvm/Object/COFF.h"
#include "llvm/Object/ELF.h"
#include "llvm/Object/ELFObjectFile.h"
#include "llvm/Object/MachO.h"
#include "llvm/Object/ObjectFile.h"
#include "llvm/Support/Error.h"
#include <mutex>
#include <thread>
#define DEBUG_TYPE "orc-resolver"
namespace llvm::orc {
LibraryResolver::LibraryResolver(const LibraryResolver::Setup &S)
: LibPathCache(S.Cache ? S.Cache : std::make_shared<LibraryPathCache>()),
LibPathResolver(S.PResolver
? S.PResolver
: std::make_shared<PathResolver>(LibPathCache)),
ScanHelper(S.BasePaths, LibPathCache, LibPathResolver),
FB(S.FilterBuilder), LibMgr(),
ShouldScanCall(S.ShouldScanCall ? S.ShouldScanCall
: [](StringRef) -> bool { return true; }),
scanBatchSize(S.ScanBatchSize) {
if (ScanHelper.getAllUnits().empty()) {
LLVM_DEBUG(dbgs() << "Warning: No base paths provided for scanning.\n");
}
}
std::unique_ptr<LibraryResolutionDriver>
LibraryResolutionDriver::create(const LibraryResolver::Setup &S) {
auto LR = std::make_unique<LibraryResolver>(S);
return std::unique_ptr<LibraryResolutionDriver>(
new LibraryResolutionDriver(std::move(LR)));
}
void LibraryResolutionDriver::addScanPath(const std::string &Path, PathType K) {
LR->ScanHelper.addBasePath(Path, K);
}
bool LibraryResolutionDriver::markLibraryLoaded(StringRef Path) {
auto Lib = LR->LibMgr.getLibrary(Path);
if (!Lib)
return false;
Lib->setState(LibraryManager::LibState::Loaded);
return true;
}
bool LibraryResolutionDriver::markLibraryUnLoaded(StringRef Path) {
auto Lib = LR->LibMgr.getLibrary(Path);
if (!Lib)
return false;
Lib->setState(LibraryManager::LibState::Unloaded);
return true;
}
void LibraryResolutionDriver::resolveSymbols(
std::vector<std::string> Syms,
LibraryResolver::OnSearchComplete OnCompletion,
const SearchConfig &Config) {
LR->searchSymbolsInLibraries(Syms, std::move(OnCompletion), Config);
}
static bool shouldIgnoreSymbol(const object::SymbolRef &Sym,
uint32_t IgnoreFlags) {
Expected<uint32_t> FlagsOrErr = Sym.getFlags();
if (!FlagsOrErr) {
consumeError(FlagsOrErr.takeError());
return true;
}
uint32_t Flags = *FlagsOrErr;
using Filter = SymbolEnumeratorOptions;
if ((IgnoreFlags & Filter::IgnoreUndefined) &&
(Flags & object::SymbolRef::SF_Undefined))
return true;
if ((IgnoreFlags & Filter::IgnoreIndirect) &&
(Flags & object::SymbolRef::SF_Indirect))
return true;
if ((IgnoreFlags & Filter::IgnoreWeak) &&
(Flags & object::SymbolRef::SF_Weak))
return true;
return false;
}
bool SymbolEnumerator::enumerateSymbols(StringRef Path, OnEachSymbolFn OnEach,
const SymbolEnumeratorOptions &Opts) {
if (Path.empty())
return false;
ObjectFileLoader ObjLoader(Path);
auto ObjOrErr = ObjLoader.getObjectFile();
if (!ObjOrErr) {
std::string ErrMsg;
handleAllErrors(ObjOrErr.takeError(),
[&](const ErrorInfoBase &EIB) { ErrMsg = EIB.message(); });
LLVM_DEBUG(dbgs() << "Failed loading object file: " << Path
<< "\nError: " << ErrMsg << "\n");
return false;
}
object::ObjectFile *Obj = &ObjOrErr.get();
auto processSymbolRange =
[&](object::ObjectFile::symbol_iterator_range Range) -> EnumerateResult {
for (const auto &Sym : Range) {
if (shouldIgnoreSymbol(Sym, Opts.FilterFlags))
continue;
auto NameOrErr = Sym.getName();
if (!NameOrErr) {
consumeError(NameOrErr.takeError());
continue;
}
StringRef Name = *NameOrErr;
if (Name.empty())
continue;
EnumerateResult Res = OnEach(Name);
if (Res != EnumerateResult::Continue)
return Res;
}
return EnumerateResult::Continue;
};
EnumerateResult Res = processSymbolRange(Obj->symbols());
if (Res != EnumerateResult::Continue)
return Res == EnumerateResult::Stop;
if (Obj->isELF()) {
const auto *ElfObj = cast<object::ELFObjectFileBase>(Obj);
Res = processSymbolRange(ElfObj->getDynamicSymbolIterators());
if (Res != EnumerateResult::Continue)
return Res == EnumerateResult::Stop;
} else if (Obj->isCOFF()) {
const auto *CoffObj = cast<object::COFFObjectFile>(Obj);
for (auto I = CoffObj->export_directory_begin(),
E = CoffObj->export_directory_end();
I != E; ++I) {
StringRef Name;
if (I->getSymbolName(Name))
continue;
if (Name.empty())
continue;
if (OnEach(Name) != EnumerateResult::Continue)
return false;
}
} else if (Obj->isMachO()) {
}
return true;
}
class SymbolSearchContext {
public:
SymbolSearchContext(SymbolQuery &Q) : Q(Q) {}
bool hasSearched(LibraryInfo *Lib) const { return Searched.count(Lib); }
void markSearched(LibraryInfo *Lib) { Searched.insert(Lib); }
inline bool allResolved() const { return Q.allResolved(); }
SymbolQuery &query() { return Q; }
private:
SymbolQuery &Q;
DenseSet<LibraryInfo *> Searched;
};
void LibraryResolver::resolveSymbolsInLibrary(
LibraryInfo &Lib, SymbolQuery &UnresolvedSymbols,
const SymbolEnumeratorOptions &Opts) {
LLVM_DEBUG(dbgs() << "Checking unresolved symbols "
<< " in library : " << Lib.getFileName() << "\n";);
StringSet<> DiscoveredSymbols;
if (!UnresolvedSymbols.hasUnresolved()) {
LLVM_DEBUG(dbgs() << "Skipping library: " << Lib.getFullPath()
<< " — unresolved symbols exist.\n";);
return;
}
bool HasEnumerated = false;
auto enumerateSymbolsIfNeeded = [&]() {
if (HasEnumerated)
return;
HasEnumerated = true;
LLVM_DEBUG(dbgs() << "Enumerating symbols in library: " << Lib.getFullPath()
<< "\n";);
SymbolEnumerator::enumerateSymbols(
Lib.getFullPath(),
[&](StringRef sym) {
DiscoveredSymbols.insert(sym);
return EnumerateResult::Continue;
},
Opts);
if (DiscoveredSymbols.empty()) {
LLVM_DEBUG(dbgs() << " No symbols and remove library : "
<< Lib.getFullPath() << "\n";);
LibMgr.removeLibrary(Lib.getFullPath());
return;
}
};
if (!Lib.hasFilter()) {
LLVM_DEBUG(dbgs() << "Building filter for library: " << Lib.getFullPath()
<< "\n";);
enumerateSymbolsIfNeeded();
SmallVector<StringRef> SymbolVec;
SymbolVec.reserve(DiscoveredSymbols.size());
for (const auto &KV : DiscoveredSymbols)
SymbolVec.push_back(KV.first());
Lib.ensureFilterBuilt(FB, SymbolVec);
LLVM_DEBUG({
dbgs() << "DiscoveredSymbols : " << DiscoveredSymbols.size() << "\n";
for (const auto &KV : DiscoveredSymbols)
dbgs() << "DiscoveredSymbols : " << KV.first() << "\n";
});
}
const auto &Unresolved = UnresolvedSymbols.getUnresolvedSymbols();
bool HadAnySym = false;
LLVM_DEBUG(dbgs() << "Total unresolved symbols : " << Unresolved.size()
<< "\n";);
for (const auto &Sym : Unresolved) {
if (Lib.mayContain(Sym)) {
LLVM_DEBUG(dbgs() << "Checking symbol '" << Sym
<< "' in library: " << Lib.getFullPath() << "\n";);
enumerateSymbolsIfNeeded();
if (DiscoveredSymbols.count(Sym) > 0) {
LLVM_DEBUG(dbgs() << " Resolved symbol: " << Sym
<< " in library: " << Lib.getFullPath() << "\n";);
UnresolvedSymbols.resolve(Sym, Lib.getFullPath());
HadAnySym = true;
}
}
}
using LibraryState = LibraryManager::LibState;
if (HadAnySym && Lib.getState() != LibraryState::Loaded)
Lib.setState(LibraryState::Queried);
}
void LibraryResolver::searchSymbolsInLibraries(
std::vector<std::string> &SymbolList, OnSearchComplete OnComplete,
const SearchConfig &Config) {
SymbolQuery Q(SymbolList);
using LibraryState = LibraryManager::LibState;
using LibraryType = PathType;
auto tryResolveFrom = [&](LibraryState S, LibraryType K) {
LLVM_DEBUG(dbgs() << "Trying resolve from state=" << static_cast<int>(S)
<< " type=" << static_cast<int>(K) << "\n";);
SymbolSearchContext Ctx(Q);
while (!Ctx.allResolved()) {
for (auto &Lib : LibMgr.getView(S, K)) {
if (Ctx.hasSearched(Lib.get()))
continue;
// can use Async here?
resolveSymbolsInLibrary(*Lib, Ctx.query(), Config.Options);
Ctx.markSearched(Lib.get());
if (Ctx.allResolved())
return;
}
if (Ctx.allResolved())
return;
if (!scanLibrariesIfNeeded(K, scanBatchSize))
break; // no more new libs to scan
}
};
for (const auto &[St, Ty] : Config.Policy.Plan) {
tryResolveFrom(St, Ty);
if (Q.allResolved())
break;
}
// done:
LLVM_DEBUG({
dbgs() << "Search complete.\n";
for (const auto &r : Q.getAllResults())
dbgs() << "Resolved Symbol:" << r->Name << " -> " << r->ResolvedLibPath
<< "\n";
});
OnComplete(Q);
}
bool LibraryResolver::scanLibrariesIfNeeded(PathType PK, size_t BatchSize) {
LLVM_DEBUG(dbgs() << "LibraryResolver::scanLibrariesIfNeeded: Scanning for "
<< (PK == PathType::User ? "User" : "System")
<< " libraries\n";);
if (!ScanHelper.leftToScan(PK))
return false;
LibraryScanner Scanner(ScanHelper, LibMgr, ShouldScanCall);
Scanner.scanNext(PK, BatchSize);
return true;
}
bool LibraryResolver::symbolExistsInLibrary(const LibraryInfo &Lib,
StringRef SymName,
std::vector<std::string> *AllSyms) {
SymbolEnumeratorOptions Opts;
return symbolExistsInLibrary(Lib, SymName, AllSyms, Opts);
}
bool LibraryResolver::symbolExistsInLibrary(
const LibraryInfo &Lib, StringRef SymName,
std::vector<std::string> *AllSyms, const SymbolEnumeratorOptions &Opts) {
bool Found = false;
SymbolEnumerator::enumerateSymbols(
Lib.getFullPath(),
[&](StringRef Sym) {
if (AllSyms)
AllSyms->emplace_back(Sym.str());
if (Sym == SymName) {
Found = true;
}
return EnumerateResult::Continue;
},
Opts);
return Found;
}
} // end namespace llvm::orc

File diff suppressed because it is too large Load Diff

View File

@ -25,7 +25,6 @@ add_llvm_unittest(OrcJITTests
IndirectionUtilsTest.cpp
JITTargetMachineBuilderTest.cpp
LazyCallThroughAndReexportsTest.cpp
LibraryResolverTest.cpp
LookupAndRecordAddrsTest.cpp
MachOPlatformTest.cpp
MapperJITLinkMemoryManagerTest.cpp

View File

@ -1,460 +0,0 @@
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R ]
FirstSec: .note.gnu.property
LastSec: .rela.plt
Align: 0x1000
Offset: 0x0
- Type: PT_LOAD
Flags: [ PF_X, PF_R ]
FirstSec: .init
LastSec: .fini
VAddr: 0x1000
Align: 0x1000
Offset: 0x1000
- Type: PT_LOAD
Flags: [ PF_R ]
FirstSec: .rodata
LastSec: .eh_frame
VAddr: 0x2000
Align: 0x1000
Offset: 0x2000
- Type: PT_LOAD
Flags: [ PF_W, PF_R ]
FirstSec: .init_array
LastSec: .bss
VAddr: 0x3E10
Align: 0x1000
Offset: 0x2E10
- Type: PT_DYNAMIC
Flags: [ PF_W, PF_R ]
FirstSec: .dynamic
LastSec: .dynamic
VAddr: 0x3E20
Align: 0x8
Offset: 0x2E20
- Type: PT_NOTE
Flags: [ PF_R ]
FirstSec: .note.gnu.property
LastSec: .note.gnu.property
VAddr: 0x2A8
Align: 0x8
Offset: 0x2A8
- Type: PT_NOTE
Flags: [ PF_R ]
FirstSec: .note.gnu.build-id
LastSec: .note.gnu.build-id
VAddr: 0x2C8
Align: 0x4
Offset: 0x2C8
- Type: PT_GNU_PROPERTY
Flags: [ PF_R ]
FirstSec: .note.gnu.property
LastSec: .note.gnu.property
VAddr: 0x2A8
Align: 0x8
Offset: 0x2A8
- Type: PT_GNU_EH_FRAME
Flags: [ PF_R ]
FirstSec: .eh_frame_hdr
LastSec: .eh_frame_hdr
VAddr: 0x2010
Align: 0x4
Offset: 0x2010
- Type: PT_GNU_STACK
Flags: [ PF_W, PF_R ]
Align: 0x10
Offset: 0x0
- Type: PT_GNU_RELRO
Flags: [ PF_R ]
FirstSec: .init_array
LastSec: .got
VAddr: 0x3E10
Offset: 0x2E10
Sections:
- Name: .note.gnu.property
Type: SHT_NOTE
Flags: [ SHF_ALLOC ]
Address: 0x2A8
AddressAlign: 0x8
Notes:
- Name: GNU
Desc: 020000C0040000000300000000000000
Type: NT_GNU_PROPERTY_TYPE_0
- Name: .note.gnu.build-id
Type: SHT_NOTE
Flags: [ SHF_ALLOC ]
Address: 0x2C8
AddressAlign: 0x4
Notes:
- Name: GNU
Desc: 73604396C95840D5C380A0950F085A778F94EE7C
Type: NT_PRPSINFO
- Name: .gnu.hash
Type: SHT_GNU_HASH
Flags: [ SHF_ALLOC ]
Address: 0x2F0
Link: .dynsym
AddressAlign: 0x8
Header:
SymNdx: 0x6
Shift2: 0x6
BloomFilter: [ 0x400000080000 ]
HashBuckets: [ 0x0, 0x6 ]
HashValues: [ 0x7C9DCB93 ]
- Name: .dynsym
Type: SHT_DYNSYM
Flags: [ SHF_ALLOC ]
Address: 0x318
Link: .dynstr
AddressAlign: 0x8
- Name: .dynstr
Type: SHT_STRTAB
Flags: [ SHF_ALLOC ]
Address: 0x3C0
AddressAlign: 0x1
- Name: .gnu.version
Type: SHT_GNU_versym
Flags: [ SHF_ALLOC ]
Address: 0x436
Link: .dynsym
AddressAlign: 0x2
Entries: [ 0, 1, 2, 1, 1, 2, 1 ]
- Name: .gnu.version_r
Type: SHT_GNU_verneed
Flags: [ SHF_ALLOC ]
Address: 0x448
Link: .dynstr
AddressAlign: 0x8
Dependencies:
- Version: 1
File: libc.so.6
Entries:
- Name: GLIBC_2.2.5
Hash: 157882997
Flags: 0
Other: 2
- Name: .rela.dyn
Type: SHT_RELA
Flags: [ SHF_ALLOC ]
Address: 0x468
Link: .dynsym
AddressAlign: 0x8
Relocations:
- Offset: 0x3E10
Type: R_X86_64_RELATIVE
Addend: 4368
- Offset: 0x3E18
Type: R_X86_64_RELATIVE
Addend: 4304
- Offset: 0x4020
Type: R_X86_64_RELATIVE
Addend: 16416
- Offset: 0x3FE0
Symbol: _ITM_deregisterTMCloneTable
Type: R_X86_64_GLOB_DAT
- Offset: 0x3FE8
Symbol: __gmon_start__
Type: R_X86_64_GLOB_DAT
- Offset: 0x3FF0
Symbol: _ITM_registerTMCloneTable
Type: R_X86_64_GLOB_DAT
- Offset: 0x3FF8
Symbol: __cxa_finalize
Type: R_X86_64_GLOB_DAT
- Name: .rela.plt
Type: SHT_RELA
Flags: [ SHF_ALLOC, SHF_INFO_LINK ]
Address: 0x510
Link: .dynsym
AddressAlign: 0x8
Info: .got.plt
Relocations:
- Offset: 0x4018
Symbol: puts
Type: R_X86_64_JUMP_SLOT
- Name: .init
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1000
AddressAlign: 0x4
Offset: 0x1000
Content: F30F1EFA4883EC08488B05D92F00004885C07402FFD04883C408C3
- Name: .plt
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1020
AddressAlign: 0x10
EntSize: 0x10
Content: FF35E22F0000F2FF25E32F00000F1F00F30F1EFA6800000000F2E9E1FFFFFF90
- Name: .plt.got
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1040
AddressAlign: 0x10
EntSize: 0x10
Content: F30F1EFAF2FF25AD2F00000F1F440000
- Name: .plt.sec
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1050
AddressAlign: 0x10
EntSize: 0x10
Content: F30F1EFAF2FF25BD2F00000F1F440000
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1060
AddressAlign: 0x10
Content: 488D3DC12F0000488D05BA2F00004839F87415488B05662F00004885C07409FFE00F1F8000000000C30F1F8000000000488D3D912F0000488D358A2F00004829FE4889F048C1EE3F48C1F8034801C648D1FE7414488B05352F00004885C07408FFE0660F1F440000C30F1F8000000000F30F1EFA803D4D2F000000752B5548833D122F0000004889E5740C488B3D2E2F0000E849FFFFFFE864FFFFFFC605252F0000015DC30F1F00C30F1F8000000000F30F1EFAE977FFFFFFF30F1EFA554889E5488D05D80E00004889C7E820FFFFFF905DC3
- Name: .fini
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1134
AddressAlign: 0x4
Content: F30F1EFA4883EC084883C408C3
- Name: .rodata
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x2000
AddressAlign: 0x1
Offset: 0x2000
Content: 48656C6C6F2066726F6D204100
- Name: .eh_frame_hdr
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x2010
AddressAlign: 0x4
Content: 011B033B2C0000000400000010F0FFFF4800000030F0FFFF7000000040F0FFFF8800000009F1FFFFA0000000
- Name: .eh_frame
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x2040
AddressAlign: 0x8
Content: 1400000000000000017A5200017810011B0C070890010000240000001C000000C0EFFFFF20000000000E10460E184A0F0B770880003F1A3A2A332422000000001400000044000000B8EFFFFF100000000000000000000000140000005C000000B0EFFFFF1000000000000000000000001C0000007400000061F0FFFF1A00000000450E108602430D06510C070800000000000000
- Name: .init_array
Type: SHT_INIT_ARRAY
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3E10
AddressAlign: 0x8
EntSize: 0x8
Offset: 0x2E10
Content: '1011000000000000'
- Name: .fini_array
Type: SHT_FINI_ARRAY
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3E18
AddressAlign: 0x8
EntSize: 0x8
Content: D010000000000000
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3E20
Link: .dynstr
AddressAlign: 0x8
Entries:
- Tag: DT_NEEDED
Value: 0x5F
- Tag: DT_INIT
Value: 0x1000
- Tag: DT_FINI
Value: 0x1134
- Tag: DT_INIT_ARRAY
Value: 0x3E10
- Tag: DT_INIT_ARRAYSZ
Value: 0x8
- Tag: DT_FINI_ARRAY
Value: 0x3E18
- Tag: DT_FINI_ARRAYSZ
Value: 0x8
- Tag: DT_GNU_HASH
Value: 0x2F0
- Tag: DT_STRTAB
Value: 0x3C0
- Tag: DT_SYMTAB
Value: 0x318
- Tag: DT_STRSZ
Value: 0x75
- Tag: DT_SYMENT
Value: 0x18
- Tag: DT_PLTGOT
Value: 0x4000
- Tag: DT_PLTRELSZ
Value: 0x18
- Tag: DT_PLTREL
Value: 0x7
- Tag: DT_JMPREL
Value: 0x510
- Tag: DT_RELA
Value: 0x468
- Tag: DT_RELASZ
Value: 0xA8
- Tag: DT_RELAENT
Value: 0x18
- Tag: DT_VERNEED
Value: 0x448
- Tag: DT_VERNEEDNUM
Value: 0x1
- Tag: DT_VERSYM
Value: 0x436
- Tag: DT_RELACOUNT
Value: 0x3
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Name: .got
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3FE0
AddressAlign: 0x8
EntSize: 0x8
Content: '0000000000000000000000000000000000000000000000000000000000000000'
- Name: .got.plt
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x4000
AddressAlign: 0x8
EntSize: 0x8
Content: '203E000000000000000000000000000000000000000000003010000000000000'
- Name: .data
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x4020
AddressAlign: 0x8
Content: '2040000000000000'
- Name: .bss
Type: SHT_NOBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x4028
AddressAlign: 0x1
Size: 0x8
- Name: .comment
Type: SHT_PROGBITS
Flags: [ SHF_MERGE, SHF_STRINGS ]
AddressAlign: 0x1
EntSize: 0x1
Content: 4743433A20285562756E74752031312E342E302D317562756E7475317E32322E30342E32292031312E342E3000
Symbols:
- Name: crtstuff.c
Type: STT_FILE
Index: SHN_ABS
- Name: deregister_tm_clones
Type: STT_FUNC
Section: .text
Value: 0x1060
- Name: register_tm_clones
Type: STT_FUNC
Section: .text
Value: 0x1090
- Name: __do_global_dtors_aux
Type: STT_FUNC
Section: .text
Value: 0x10D0
- Name: completed.0
Type: STT_OBJECT
Section: .bss
Value: 0x4028
Size: 0x1
- Name: __do_global_dtors_aux_fini_array_entry
Type: STT_OBJECT
Section: .fini_array
Value: 0x3E18
- Name: frame_dummy
Type: STT_FUNC
Section: .text
Value: 0x1110
- Name: __frame_dummy_init_array_entry
Type: STT_OBJECT
Section: .init_array
Value: 0x3E10
- Name: libA.c
Type: STT_FILE
Index: SHN_ABS
- Name: 'crtstuff.c (1)'
Type: STT_FILE
Index: SHN_ABS
- Name: __FRAME_END__
Type: STT_OBJECT
Section: .eh_frame
Value: 0x20D0
- Type: STT_FILE
Index: SHN_ABS
- Name: _fini
Type: STT_FUNC
Section: .fini
Value: 0x1134
- Name: __dso_handle
Type: STT_OBJECT
Section: .data
Value: 0x4020
- Name: _DYNAMIC
Type: STT_OBJECT
Section: .dynamic
Value: 0x3E20
- Name: __GNU_EH_FRAME_HDR
Section: .eh_frame_hdr
Value: 0x2010
- Name: __TMC_END__
Type: STT_OBJECT
Section: .data
Value: 0x4028
- Name: _GLOBAL_OFFSET_TABLE_
Type: STT_OBJECT
Section: .got.plt
Value: 0x4000
- Name: _init
Type: STT_FUNC
Section: .init
Value: 0x1000
- Name: _ITM_deregisterTMCloneTable
Binding: STB_WEAK
- Name: 'puts@GLIBC_2.2.5'
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: sayA
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
Value: 0x1119
Size: 0x1A
- Name: __gmon_start__
Binding: STB_WEAK
- Name: _ITM_registerTMCloneTable
Binding: STB_WEAK
- Name: '__cxa_finalize@GLIBC_2.2.5'
Type: STT_FUNC
Binding: STB_WEAK
DynamicSymbols:
- Name: _ITM_deregisterTMCloneTable
Binding: STB_WEAK
- Name: puts
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: __gmon_start__
Binding: STB_WEAK
- Name: _ITM_registerTMCloneTable
Binding: STB_WEAK
- Name: __cxa_finalize
Type: STT_FUNC
Binding: STB_WEAK
- Name: sayA
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
Value: 0x1119
Size: 0x1A
...

View File

@ -1,723 +0,0 @@
--- !fat-mach-o
FatHeader:
magic: 0xCAFEBABE
nfat_arch: 3
FatArchs:
- cputype: 0x1000007
cpusubtype: 0x3
offset: 0x1000
size: 8376
align: 12
- cputype: 0x100000C
cpusubtype: 0x0
offset: 0x4000
size: 33376
align: 14
- cputype: 0x100000C
cpusubtype: 0x80000002
offset: 0x10000
size: 33376
align: 14
Slices:
- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x1000007
cpusubtype: 0x3
filetype: 0x6
ncmds: 14
sizeofcmds: 960
flags: 0x100085
reserved: 0x0
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 392
segname: __TEXT
vmaddr: 0
vmsize: 4096
fileoff: 0
filesize: 4096
maxprot: 5
initprot: 5
nsects: 4
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0xF80
size: 20
offset: 0xF80
align: 4
reloff: 0x0
nreloc: 0
flags: 0x80000400
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 554889E5488D3D0F000000B000E8020000005DC3
- sectname: __stubs
segname: __TEXT
addr: 0xF94
size: 6
offset: 0xF94
align: 1
reloff: 0x0
nreloc: 0
flags: 0x80000408
reserved1: 0x0
reserved2: 0x6
reserved3: 0x0
content: FF2566000000
- sectname: __cstring
segname: __TEXT
addr: 0xF9A
size: 14
offset: 0xF9A
align: 0
reloff: 0x0
nreloc: 0
flags: 0x2
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 48656C6C6F2066726F6D20410A00
- sectname: __unwind_info
segname: __TEXT
addr: 0xFA8
size: 88
offset: 0xFA8
align: 2
reloff: 0x0
nreloc: 0
flags: 0x0
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 010000001C000000000000001C000000000000001C00000002000000800F00004000000040000000940F00000000000040000000000000000000000000000000030000000C00010010000100000000000000000100000000
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DATA_CONST
vmaddr: 4096
vmsize: 4096
fileoff: 4096
filesize: 4096
maxprot: 3
initprot: 3
nsects: 1
flags: 16
Sections:
- sectname: __got
segname: __DATA_CONST
addr: 0x1000
size: 8
offset: 0x1000
align: 3
reloff: 0x0
nreloc: 0
flags: 0x6
reserved1: 0x1
reserved2: 0x0
reserved3: 0x0
content: '0000000000000080'
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __LINKEDIT
vmaddr: 8192
vmsize: 4096
fileoff: 8192
filesize: 184
maxprot: 1
initprot: 1
nsects: 0
flags: 0
- cmd: LC_ID_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 1
current_version: 0
compatibility_version: 0
Content: '@rpath/libA.dylib'
ZeroPadBytes: 7
- cmd: LC_DYLD_CHAINED_FIXUPS
cmdsize: 16
dataoff: 8192
datasize: 96
- cmd: LC_DYLD_EXPORTS_TRIE
cmdsize: 16
dataoff: 8288
datasize: 24
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 8320
nsyms: 2
stroff: 8360
strsize: 16
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 0
iextdefsym: 0
nextdefsym: 1
iundefsym: 1
nundefsym: 1
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 8352
nindirectsyms: 2
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
- cmd: LC_UUID
cmdsize: 24
uuid: ADFFA141-C3EE-37CD-B1E7-906D69F81BCB
- cmd: LC_BUILD_VERSION
cmdsize: 32
platform: 1
minos: 983040
sdk: 983552
ntools: 1
Tools:
- tool: 3
version: 73074435
- cmd: LC_SOURCE_VERSION
cmdsize: 16
version: 0
- cmd: LC_LOAD_DYLIB
cmdsize: 56
dylib:
name: 24
timestamp: 2
current_version: 88539136
compatibility_version: 65536
Content: '/usr/lib/libSystem.B.dylib'
ZeroPadBytes: 6
- cmd: LC_FUNCTION_STARTS
cmdsize: 16
dataoff: 8312
datasize: 8
- cmd: LC_DATA_IN_CODE
cmdsize: 16
dataoff: 8320
datasize: 0
LinkEditData:
ExportTrie:
TerminalSize: 0
NodeOffset: 0
Name: ''
Flags: 0x0
Address: 0x0
Other: 0x0
ImportName: ''
Children:
- TerminalSize: 3
NodeOffset: 13
Name: _sayA
Flags: 0x0
Address: 0xF80
Other: 0x0
ImportName: ''
NameList:
- n_strx: 2
n_type: 0xF
n_sect: 1
n_desc: 0
n_value: 3968
- n_strx: 8
n_type: 0x1
n_sect: 0
n_desc: 256
n_value: 0
StringTable:
- ' '
- _sayA
- _printf
IndirectSymbols: [ 0x1, 0x1 ]
FunctionStarts: [ 0xF80 ]
ChainedFixups: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x48,
0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x1, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x10, 0x6, 0x0,
0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5F, 0x70, 0x72,
0x69, 0x6E, 0x74, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0 ]
- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x100000C
cpusubtype: 0x0
filetype: 0x6
ncmds: 15
sizeofcmds: 976
flags: 0x100085
reserved: 0x0
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 392
segname: __TEXT
vmaddr: 0
vmsize: 16384
fileoff: 0
filesize: 16384
maxprot: 5
initprot: 5
nsects: 4
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x3F70
size: 28
offset: 0x3F70
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000400
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: FD7BBFA9FD0300910000009000603E9103000094FD7BC1A8C0035FD6
- sectname: __stubs
segname: __TEXT
addr: 0x3F8C
size: 12
offset: 0x3F8C
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000408
reserved1: 0x0
reserved2: 0xC
reserved3: 0x0
content: 100000B0100240F900021FD6
- sectname: __cstring
segname: __TEXT
addr: 0x3F98
size: 14
offset: 0x3F98
align: 0
reloff: 0x0
nreloc: 0
flags: 0x2
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 48656C6C6F2066726F6D20410A00
- sectname: __unwind_info
segname: __TEXT
addr: 0x3FA8
size: 88
offset: 0x3FA8
align: 2
reloff: 0x0
nreloc: 0
flags: 0x0
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 010000001C000000000000001C000000000000001C00000002000000703F000040000000400000008C3F00000000000040000000000000000000000000000000030000000C00010010000100000000000000000400000000
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DATA_CONST
vmaddr: 16384
vmsize: 16384
fileoff: 16384
filesize: 16384
maxprot: 3
initprot: 3
nsects: 1
flags: 16
Sections:
- sectname: __got
segname: __DATA_CONST
addr: 0x4000
size: 8
offset: 0x4000
align: 3
reloff: 0x0
nreloc: 0
flags: 0x6
reserved1: 0x1
reserved2: 0x0
reserved3: 0x0
content: '0000000000000080'
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __LINKEDIT
vmaddr: 32768
vmsize: 16384
fileoff: 32768
filesize: 608
maxprot: 1
initprot: 1
nsects: 0
flags: 0
- cmd: LC_ID_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 1
current_version: 0
compatibility_version: 0
Content: '@rpath/libA.dylib'
ZeroPadBytes: 7
- cmd: LC_DYLD_CHAINED_FIXUPS
cmdsize: 16
dataoff: 32768
datasize: 96
- cmd: LC_DYLD_EXPORTS_TRIE
cmdsize: 16
dataoff: 32864
datasize: 24
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 32896
nsyms: 2
stroff: 32936
strsize: 16
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 0
iextdefsym: 0
nextdefsym: 1
iundefsym: 1
nundefsym: 1
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 32928
nindirectsyms: 2
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
- cmd: LC_UUID
cmdsize: 24
uuid: C45227E0-C6C0-3137-969B-36AABF9D5487
- cmd: LC_BUILD_VERSION
cmdsize: 32
platform: 1
minos: 983040
sdk: 983552
ntools: 1
Tools:
- tool: 3
version: 73074435
- cmd: LC_SOURCE_VERSION
cmdsize: 16
version: 0
- cmd: LC_LOAD_DYLIB
cmdsize: 56
dylib:
name: 24
timestamp: 2
current_version: 88539136
compatibility_version: 65536
Content: '/usr/lib/libSystem.B.dylib'
ZeroPadBytes: 6
- cmd: LC_FUNCTION_STARTS
cmdsize: 16
dataoff: 32888
datasize: 8
- cmd: LC_DATA_IN_CODE
cmdsize: 16
dataoff: 32896
datasize: 0
- cmd: LC_CODE_SIGNATURE
cmdsize: 16
dataoff: 32960
datasize: 416
LinkEditData:
ExportTrie:
TerminalSize: 0
NodeOffset: 0
Name: ''
Flags: 0x0
Address: 0x0
Other: 0x0
ImportName: ''
Children:
- TerminalSize: 3
NodeOffset: 13
Name: _sayA
Flags: 0x0
Address: 0x3F70
Other: 0x0
ImportName: ''
NameList:
- n_strx: 2
n_type: 0xF
n_sect: 1
n_desc: 0
n_value: 16240
- n_strx: 8
n_type: 0x1
n_sect: 0
n_desc: 256
n_value: 0
StringTable:
- ' '
- _sayA
- _printf
IndirectSymbols: [ 0x1, 0x1 ]
FunctionStarts: [ 0x3F70 ]
ChainedFixups: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x48,
0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x1, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x40, 0x6, 0x0,
0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5F, 0x70, 0x72,
0x69, 0x6E, 0x74, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0 ]
- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x100000C
cpusubtype: 0x80000002
filetype: 0x6
ncmds: 15
sizeofcmds: 976
flags: 0x100085
reserved: 0x0
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 392
segname: __TEXT
vmaddr: 0
vmsize: 16384
fileoff: 0
filesize: 16384
maxprot: 5
initprot: 5
nsects: 4
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x3F68
size: 32
offset: 0x3F68
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000400
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 7F2303D5FD7BBFA9FD0300910000009000603E9103000094FD7BC1A8FF0F5FD6
- sectname: __auth_stubs
segname: __TEXT
addr: 0x3F88
size: 16
offset: 0x3F88
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000408
reserved1: 0x0
reserved2: 0x10
reserved3: 0x0
content: 110000B031020091300240F9110A1FD7
- sectname: __cstring
segname: __TEXT
addr: 0x3F98
size: 14
offset: 0x3F98
align: 0
reloff: 0x0
nreloc: 0
flags: 0x2
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 48656C6C6F2066726F6D20410A00
- sectname: __unwind_info
segname: __TEXT
addr: 0x3FA8
size: 88
offset: 0x3FA8
align: 2
reloff: 0x0
nreloc: 0
flags: 0x0
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 010000001C000000000000001C000000000000001C00000002000000683F00004000000040000000883F00000000000040000000000000000000000000000000030000000C00010010000100000000000000000400000000
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DATA_CONST
vmaddr: 16384
vmsize: 16384
fileoff: 16384
filesize: 16384
maxprot: 3
initprot: 3
nsects: 1
flags: 16
Sections:
- sectname: __auth_got
segname: __DATA_CONST
addr: 0x4000
size: 8
offset: 0x4000
align: 3
reloff: 0x0
nreloc: 0
flags: 0x6
reserved1: 0x1
reserved2: 0x0
reserved3: 0x0
content: 00000000000001C0
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __LINKEDIT
vmaddr: 32768
vmsize: 16384
fileoff: 32768
filesize: 608
maxprot: 1
initprot: 1
nsects: 0
flags: 0
- cmd: LC_ID_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 1
current_version: 0
compatibility_version: 0
Content: '@rpath/libA.dylib'
ZeroPadBytes: 7
- cmd: LC_DYLD_CHAINED_FIXUPS
cmdsize: 16
dataoff: 32768
datasize: 96
- cmd: LC_DYLD_EXPORTS_TRIE
cmdsize: 16
dataoff: 32864
datasize: 24
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 32896
nsyms: 2
stroff: 32936
strsize: 16
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 0
iextdefsym: 0
nextdefsym: 1
iundefsym: 1
nundefsym: 1
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 32928
nindirectsyms: 2
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
- cmd: LC_UUID
cmdsize: 24
uuid: C9DC00C2-E721-365C-9C2D-E9FDB7C838BB
- cmd: LC_BUILD_VERSION
cmdsize: 32
platform: 1
minos: 983040
sdk: 983552
ntools: 1
Tools:
- tool: 3
version: 73074435
- cmd: LC_SOURCE_VERSION
cmdsize: 16
version: 0
- cmd: LC_LOAD_DYLIB
cmdsize: 56
dylib:
name: 24
timestamp: 2
current_version: 88539136
compatibility_version: 65536
Content: '/usr/lib/libSystem.B.dylib'
ZeroPadBytes: 6
- cmd: LC_FUNCTION_STARTS
cmdsize: 16
dataoff: 32888
datasize: 8
- cmd: LC_DATA_IN_CODE
cmdsize: 16
dataoff: 32896
datasize: 0
- cmd: LC_CODE_SIGNATURE
cmdsize: 16
dataoff: 32960
datasize: 416
LinkEditData:
ExportTrie:
TerminalSize: 0
NodeOffset: 0
Name: ''
Flags: 0x0
Address: 0x0
Other: 0x0
ImportName: ''
Children:
- TerminalSize: 3
NodeOffset: 13
Name: _sayA
Flags: 0x0
Address: 0x3F68
Other: 0x0
ImportName: ''
NameList:
- n_strx: 2
n_type: 0xF
n_sect: 1
n_desc: 0
n_value: 16232
- n_strx: 8
n_type: 0x1
n_sect: 0
n_desc: 256
n_value: 0
StringTable:
- ' '
- _sayA
- _printf
IndirectSymbols: [ 0x1, 0x1 ]
FunctionStarts: [ 0x3F68 ]
ChainedFixups: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x48,
0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x1, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x40, 0xC, 0x0,
0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5F, 0x70, 0x72,
0x69, 0x6E, 0x74, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0 ]
...

View File

@ -1,460 +0,0 @@
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R ]
FirstSec: .note.gnu.property
LastSec: .rela.plt
Align: 0x1000
Offset: 0x0
- Type: PT_LOAD
Flags: [ PF_X, PF_R ]
FirstSec: .init
LastSec: .fini
VAddr: 0x1000
Align: 0x1000
Offset: 0x1000
- Type: PT_LOAD
Flags: [ PF_R ]
FirstSec: .rodata
LastSec: .eh_frame
VAddr: 0x2000
Align: 0x1000
Offset: 0x2000
- Type: PT_LOAD
Flags: [ PF_W, PF_R ]
FirstSec: .init_array
LastSec: .bss
VAddr: 0x3E10
Align: 0x1000
Offset: 0x2E10
- Type: PT_DYNAMIC
Flags: [ PF_W, PF_R ]
FirstSec: .dynamic
LastSec: .dynamic
VAddr: 0x3E20
Align: 0x8
Offset: 0x2E20
- Type: PT_NOTE
Flags: [ PF_R ]
FirstSec: .note.gnu.property
LastSec: .note.gnu.property
VAddr: 0x2A8
Align: 0x8
Offset: 0x2A8
- Type: PT_NOTE
Flags: [ PF_R ]
FirstSec: .note.gnu.build-id
LastSec: .note.gnu.build-id
VAddr: 0x2C8
Align: 0x4
Offset: 0x2C8
- Type: PT_GNU_PROPERTY
Flags: [ PF_R ]
FirstSec: .note.gnu.property
LastSec: .note.gnu.property
VAddr: 0x2A8
Align: 0x8
Offset: 0x2A8
- Type: PT_GNU_EH_FRAME
Flags: [ PF_R ]
FirstSec: .eh_frame_hdr
LastSec: .eh_frame_hdr
VAddr: 0x2010
Align: 0x4
Offset: 0x2010
- Type: PT_GNU_STACK
Flags: [ PF_W, PF_R ]
Align: 0x10
Offset: 0x0
- Type: PT_GNU_RELRO
Flags: [ PF_R ]
FirstSec: .init_array
LastSec: .got
VAddr: 0x3E10
Offset: 0x2E10
Sections:
- Name: .note.gnu.property
Type: SHT_NOTE
Flags: [ SHF_ALLOC ]
Address: 0x2A8
AddressAlign: 0x8
Notes:
- Name: GNU
Desc: 020000C0040000000300000000000000
Type: NT_GNU_PROPERTY_TYPE_0
- Name: .note.gnu.build-id
Type: SHT_NOTE
Flags: [ SHF_ALLOC ]
Address: 0x2C8
AddressAlign: 0x4
Notes:
- Name: GNU
Desc: 6337F7C1BF21A1DE17630C55602EB4CAC50435BB
Type: NT_PRPSINFO
- Name: .gnu.hash
Type: SHT_GNU_HASH
Flags: [ SHF_ALLOC ]
Address: 0x2F0
Link: .dynsym
AddressAlign: 0x8
Header:
SymNdx: 0x6
Shift2: 0x6
BloomFilter: [ 0x400000100000 ]
HashBuckets: [ 0x6, 0x0 ]
HashValues: [ 0x7C9DCB95 ]
- Name: .dynsym
Type: SHT_DYNSYM
Flags: [ SHF_ALLOC ]
Address: 0x318
Link: .dynstr
AddressAlign: 0x8
- Name: .dynstr
Type: SHT_STRTAB
Flags: [ SHF_ALLOC ]
Address: 0x3C0
AddressAlign: 0x1
- Name: .gnu.version
Type: SHT_GNU_versym
Flags: [ SHF_ALLOC ]
Address: 0x436
Link: .dynsym
AddressAlign: 0x2
Entries: [ 0, 1, 2, 1, 1, 2, 1 ]
- Name: .gnu.version_r
Type: SHT_GNU_verneed
Flags: [ SHF_ALLOC ]
Address: 0x448
Link: .dynstr
AddressAlign: 0x8
Dependencies:
- Version: 1
File: libc.so.6
Entries:
- Name: GLIBC_2.2.5
Hash: 157882997
Flags: 0
Other: 2
- Name: .rela.dyn
Type: SHT_RELA
Flags: [ SHF_ALLOC ]
Address: 0x468
Link: .dynsym
AddressAlign: 0x8
Relocations:
- Offset: 0x3E10
Type: R_X86_64_RELATIVE
Addend: 4368
- Offset: 0x3E18
Type: R_X86_64_RELATIVE
Addend: 4304
- Offset: 0x4020
Type: R_X86_64_RELATIVE
Addend: 16416
- Offset: 0x3FE0
Symbol: _ITM_deregisterTMCloneTable
Type: R_X86_64_GLOB_DAT
- Offset: 0x3FE8
Symbol: __gmon_start__
Type: R_X86_64_GLOB_DAT
- Offset: 0x3FF0
Symbol: _ITM_registerTMCloneTable
Type: R_X86_64_GLOB_DAT
- Offset: 0x3FF8
Symbol: __cxa_finalize
Type: R_X86_64_GLOB_DAT
- Name: .rela.plt
Type: SHT_RELA
Flags: [ SHF_ALLOC, SHF_INFO_LINK ]
Address: 0x510
Link: .dynsym
AddressAlign: 0x8
Info: .got.plt
Relocations:
- Offset: 0x4018
Symbol: puts
Type: R_X86_64_JUMP_SLOT
- Name: .init
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1000
AddressAlign: 0x4
Offset: 0x1000
Content: F30F1EFA4883EC08488B05D92F00004885C07402FFD04883C408C3
- Name: .plt
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1020
AddressAlign: 0x10
EntSize: 0x10
Content: FF35E22F0000F2FF25E32F00000F1F00F30F1EFA6800000000F2E9E1FFFFFF90
- Name: .plt.got
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1040
AddressAlign: 0x10
EntSize: 0x10
Content: F30F1EFAF2FF25AD2F00000F1F440000
- Name: .plt.sec
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1050
AddressAlign: 0x10
EntSize: 0x10
Content: F30F1EFAF2FF25BD2F00000F1F440000
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1060
AddressAlign: 0x10
Content: 488D3DC12F0000488D05BA2F00004839F87415488B05662F00004885C07409FFE00F1F8000000000C30F1F8000000000488D3D912F0000488D358A2F00004829FE4889F048C1EE3F48C1F8034801C648D1FE7414488B05352F00004885C07408FFE0660F1F440000C30F1F8000000000F30F1EFA803D4D2F000000752B5548833D122F0000004889E5740C488B3D2E2F0000E849FFFFFFE864FFFFFFC605252F0000015DC30F1F00C30F1F8000000000F30F1EFAE977FFFFFFF30F1EFA554889E5488D05D80E00004889C7E820FFFFFF905DC3
- Name: .fini
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1134
AddressAlign: 0x4
Content: F30F1EFA4883EC084883C408C3
- Name: .rodata
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x2000
AddressAlign: 0x1
Offset: 0x2000
Content: 48656C6C6F2066726F6D204200
- Name: .eh_frame_hdr
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x2010
AddressAlign: 0x4
Content: 011B033B2C0000000400000010F0FFFF4800000030F0FFFF7000000040F0FFFF8800000009F1FFFFA0000000
- Name: .eh_frame
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x2040
AddressAlign: 0x8
Content: 1400000000000000017A5200017810011B0C070890010000240000001C000000C0EFFFFF20000000000E10460E184A0F0B770880003F1A3A2A332422000000001400000044000000B8EFFFFF100000000000000000000000140000005C000000B0EFFFFF1000000000000000000000001C0000007400000061F0FFFF1A00000000450E108602430D06510C070800000000000000
- Name: .init_array
Type: SHT_INIT_ARRAY
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3E10
AddressAlign: 0x8
EntSize: 0x8
Offset: 0x2E10
Content: '1011000000000000'
- Name: .fini_array
Type: SHT_FINI_ARRAY
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3E18
AddressAlign: 0x8
EntSize: 0x8
Content: D010000000000000
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3E20
Link: .dynstr
AddressAlign: 0x8
Entries:
- Tag: DT_NEEDED
Value: 0x5F
- Tag: DT_INIT
Value: 0x1000
- Tag: DT_FINI
Value: 0x1134
- Tag: DT_INIT_ARRAY
Value: 0x3E10
- Tag: DT_INIT_ARRAYSZ
Value: 0x8
- Tag: DT_FINI_ARRAY
Value: 0x3E18
- Tag: DT_FINI_ARRAYSZ
Value: 0x8
- Tag: DT_GNU_HASH
Value: 0x2F0
- Tag: DT_STRTAB
Value: 0x3C0
- Tag: DT_SYMTAB
Value: 0x318
- Tag: DT_STRSZ
Value: 0x75
- Tag: DT_SYMENT
Value: 0x18
- Tag: DT_PLTGOT
Value: 0x4000
- Tag: DT_PLTRELSZ
Value: 0x18
- Tag: DT_PLTREL
Value: 0x7
- Tag: DT_JMPREL
Value: 0x510
- Tag: DT_RELA
Value: 0x468
- Tag: DT_RELASZ
Value: 0xA8
- Tag: DT_RELAENT
Value: 0x18
- Tag: DT_VERNEED
Value: 0x448
- Tag: DT_VERNEEDNUM
Value: 0x1
- Tag: DT_VERSYM
Value: 0x436
- Tag: DT_RELACOUNT
Value: 0x3
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Name: .got
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3FE0
AddressAlign: 0x8
EntSize: 0x8
Content: '0000000000000000000000000000000000000000000000000000000000000000'
- Name: .got.plt
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x4000
AddressAlign: 0x8
EntSize: 0x8
Content: '203E000000000000000000000000000000000000000000003010000000000000'
- Name: .data
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x4020
AddressAlign: 0x8
Content: '2040000000000000'
- Name: .bss
Type: SHT_NOBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x4028
AddressAlign: 0x1
Size: 0x8
- Name: .comment
Type: SHT_PROGBITS
Flags: [ SHF_MERGE, SHF_STRINGS ]
AddressAlign: 0x1
EntSize: 0x1
Content: 4743433A20285562756E74752031312E342E302D317562756E7475317E32322E30342E32292031312E342E3000
Symbols:
- Name: crtstuff.c
Type: STT_FILE
Index: SHN_ABS
- Name: deregister_tm_clones
Type: STT_FUNC
Section: .text
Value: 0x1060
- Name: register_tm_clones
Type: STT_FUNC
Section: .text
Value: 0x1090
- Name: __do_global_dtors_aux
Type: STT_FUNC
Section: .text
Value: 0x10D0
- Name: completed.0
Type: STT_OBJECT
Section: .bss
Value: 0x4028
Size: 0x1
- Name: __do_global_dtors_aux_fini_array_entry
Type: STT_OBJECT
Section: .fini_array
Value: 0x3E18
- Name: frame_dummy
Type: STT_FUNC
Section: .text
Value: 0x1110
- Name: __frame_dummy_init_array_entry
Type: STT_OBJECT
Section: .init_array
Value: 0x3E10
- Name: libB.c
Type: STT_FILE
Index: SHN_ABS
- Name: 'crtstuff.c (1)'
Type: STT_FILE
Index: SHN_ABS
- Name: __FRAME_END__
Type: STT_OBJECT
Section: .eh_frame
Value: 0x20D0
- Type: STT_FILE
Index: SHN_ABS
- Name: _fini
Type: STT_FUNC
Section: .fini
Value: 0x1134
- Name: __dso_handle
Type: STT_OBJECT
Section: .data
Value: 0x4020
- Name: _DYNAMIC
Type: STT_OBJECT
Section: .dynamic
Value: 0x3E20
- Name: __GNU_EH_FRAME_HDR
Section: .eh_frame_hdr
Value: 0x2010
- Name: __TMC_END__
Type: STT_OBJECT
Section: .data
Value: 0x4028
- Name: _GLOBAL_OFFSET_TABLE_
Type: STT_OBJECT
Section: .got.plt
Value: 0x4000
- Name: _init
Type: STT_FUNC
Section: .init
Value: 0x1000
- Name: _ITM_deregisterTMCloneTable
Binding: STB_WEAK
- Name: 'puts@GLIBC_2.2.5'
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: __gmon_start__
Binding: STB_WEAK
- Name: sayB
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
Value: 0x1119
Size: 0x1A
- Name: _ITM_registerTMCloneTable
Binding: STB_WEAK
- Name: '__cxa_finalize@GLIBC_2.2.5'
Type: STT_FUNC
Binding: STB_WEAK
DynamicSymbols:
- Name: _ITM_deregisterTMCloneTable
Binding: STB_WEAK
- Name: puts
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: __gmon_start__
Binding: STB_WEAK
- Name: _ITM_registerTMCloneTable
Binding: STB_WEAK
- Name: __cxa_finalize
Type: STT_FUNC
Binding: STB_WEAK
- Name: sayB
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
Value: 0x1119
Size: 0x1A
...

View File

@ -1,723 +0,0 @@
--- !fat-mach-o
FatHeader:
magic: 0xCAFEBABE
nfat_arch: 3
FatArchs:
- cputype: 0x1000007
cpusubtype: 0x3
offset: 0x1000
size: 8376
align: 12
- cputype: 0x100000C
cpusubtype: 0x0
offset: 0x4000
size: 33376
align: 14
- cputype: 0x100000C
cpusubtype: 0x80000002
offset: 0x10000
size: 33376
align: 14
Slices:
- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x1000007
cpusubtype: 0x3
filetype: 0x6
ncmds: 14
sizeofcmds: 960
flags: 0x100085
reserved: 0x0
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 392
segname: __TEXT
vmaddr: 0
vmsize: 4096
fileoff: 0
filesize: 4096
maxprot: 5
initprot: 5
nsects: 4
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0xF80
size: 20
offset: 0xF80
align: 4
reloff: 0x0
nreloc: 0
flags: 0x80000400
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 554889E5488D3D0F000000B000E8020000005DC3
- sectname: __stubs
segname: __TEXT
addr: 0xF94
size: 6
offset: 0xF94
align: 1
reloff: 0x0
nreloc: 0
flags: 0x80000408
reserved1: 0x0
reserved2: 0x6
reserved3: 0x0
content: FF2566000000
- sectname: __cstring
segname: __TEXT
addr: 0xF9A
size: 14
offset: 0xF9A
align: 0
reloff: 0x0
nreloc: 0
flags: 0x2
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 48656C6C6F2066726F6D20420A00
- sectname: __unwind_info
segname: __TEXT
addr: 0xFA8
size: 88
offset: 0xFA8
align: 2
reloff: 0x0
nreloc: 0
flags: 0x0
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 010000001C000000000000001C000000000000001C00000002000000800F00004000000040000000940F00000000000040000000000000000000000000000000030000000C00010010000100000000000000000100000000
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DATA_CONST
vmaddr: 4096
vmsize: 4096
fileoff: 4096
filesize: 4096
maxprot: 3
initprot: 3
nsects: 1
flags: 16
Sections:
- sectname: __got
segname: __DATA_CONST
addr: 0x1000
size: 8
offset: 0x1000
align: 3
reloff: 0x0
nreloc: 0
flags: 0x6
reserved1: 0x1
reserved2: 0x0
reserved3: 0x0
content: '0000000000000080'
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __LINKEDIT
vmaddr: 8192
vmsize: 4096
fileoff: 8192
filesize: 184
maxprot: 1
initprot: 1
nsects: 0
flags: 0
- cmd: LC_ID_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 1
current_version: 0
compatibility_version: 0
Content: '@rpath/libB.dylib'
ZeroPadBytes: 7
- cmd: LC_DYLD_CHAINED_FIXUPS
cmdsize: 16
dataoff: 8192
datasize: 96
- cmd: LC_DYLD_EXPORTS_TRIE
cmdsize: 16
dataoff: 8288
datasize: 24
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 8320
nsyms: 2
stroff: 8360
strsize: 16
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 0
iextdefsym: 0
nextdefsym: 1
iundefsym: 1
nundefsym: 1
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 8352
nindirectsyms: 2
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
- cmd: LC_UUID
cmdsize: 24
uuid: 88B60B3C-13D3-3D7E-AEED-5F3E991FDF08
- cmd: LC_BUILD_VERSION
cmdsize: 32
platform: 1
minos: 983040
sdk: 983552
ntools: 1
Tools:
- tool: 3
version: 73074435
- cmd: LC_SOURCE_VERSION
cmdsize: 16
version: 0
- cmd: LC_LOAD_DYLIB
cmdsize: 56
dylib:
name: 24
timestamp: 2
current_version: 88539136
compatibility_version: 65536
Content: '/usr/lib/libSystem.B.dylib'
ZeroPadBytes: 6
- cmd: LC_FUNCTION_STARTS
cmdsize: 16
dataoff: 8312
datasize: 8
- cmd: LC_DATA_IN_CODE
cmdsize: 16
dataoff: 8320
datasize: 0
LinkEditData:
ExportTrie:
TerminalSize: 0
NodeOffset: 0
Name: ''
Flags: 0x0
Address: 0x0
Other: 0x0
ImportName: ''
Children:
- TerminalSize: 3
NodeOffset: 13
Name: _sayB
Flags: 0x0
Address: 0xF80
Other: 0x0
ImportName: ''
NameList:
- n_strx: 2
n_type: 0xF
n_sect: 1
n_desc: 0
n_value: 3968
- n_strx: 8
n_type: 0x1
n_sect: 0
n_desc: 256
n_value: 0
StringTable:
- ' '
- _sayB
- _printf
IndirectSymbols: [ 0x1, 0x1 ]
FunctionStarts: [ 0xF80 ]
ChainedFixups: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x48,
0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x1, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x10, 0x6, 0x0,
0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5F, 0x70, 0x72,
0x69, 0x6E, 0x74, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0 ]
- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x100000C
cpusubtype: 0x0
filetype: 0x6
ncmds: 15
sizeofcmds: 976
flags: 0x100085
reserved: 0x0
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 392
segname: __TEXT
vmaddr: 0
vmsize: 16384
fileoff: 0
filesize: 16384
maxprot: 5
initprot: 5
nsects: 4
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x3F70
size: 28
offset: 0x3F70
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000400
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: FD7BBFA9FD0300910000009000603E9103000094FD7BC1A8C0035FD6
- sectname: __stubs
segname: __TEXT
addr: 0x3F8C
size: 12
offset: 0x3F8C
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000408
reserved1: 0x0
reserved2: 0xC
reserved3: 0x0
content: 100000B0100240F900021FD6
- sectname: __cstring
segname: __TEXT
addr: 0x3F98
size: 14
offset: 0x3F98
align: 0
reloff: 0x0
nreloc: 0
flags: 0x2
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 48656C6C6F2066726F6D20420A00
- sectname: __unwind_info
segname: __TEXT
addr: 0x3FA8
size: 88
offset: 0x3FA8
align: 2
reloff: 0x0
nreloc: 0
flags: 0x0
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 010000001C000000000000001C000000000000001C00000002000000703F000040000000400000008C3F00000000000040000000000000000000000000000000030000000C00010010000100000000000000000400000000
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DATA_CONST
vmaddr: 16384
vmsize: 16384
fileoff: 16384
filesize: 16384
maxprot: 3
initprot: 3
nsects: 1
flags: 16
Sections:
- sectname: __got
segname: __DATA_CONST
addr: 0x4000
size: 8
offset: 0x4000
align: 3
reloff: 0x0
nreloc: 0
flags: 0x6
reserved1: 0x1
reserved2: 0x0
reserved3: 0x0
content: '0000000000000080'
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __LINKEDIT
vmaddr: 32768
vmsize: 16384
fileoff: 32768
filesize: 608
maxprot: 1
initprot: 1
nsects: 0
flags: 0
- cmd: LC_ID_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 1
current_version: 0
compatibility_version: 0
Content: '@rpath/libB.dylib'
ZeroPadBytes: 7
- cmd: LC_DYLD_CHAINED_FIXUPS
cmdsize: 16
dataoff: 32768
datasize: 96
- cmd: LC_DYLD_EXPORTS_TRIE
cmdsize: 16
dataoff: 32864
datasize: 24
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 32896
nsyms: 2
stroff: 32936
strsize: 16
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 0
iextdefsym: 0
nextdefsym: 1
iundefsym: 1
nundefsym: 1
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 32928
nindirectsyms: 2
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
- cmd: LC_UUID
cmdsize: 24
uuid: 90C3787A-22E1-35AE-9284-97A4842F88AF
- cmd: LC_BUILD_VERSION
cmdsize: 32
platform: 1
minos: 983040
sdk: 983552
ntools: 1
Tools:
- tool: 3
version: 73074435
- cmd: LC_SOURCE_VERSION
cmdsize: 16
version: 0
- cmd: LC_LOAD_DYLIB
cmdsize: 56
dylib:
name: 24
timestamp: 2
current_version: 88539136
compatibility_version: 65536
Content: '/usr/lib/libSystem.B.dylib'
ZeroPadBytes: 6
- cmd: LC_FUNCTION_STARTS
cmdsize: 16
dataoff: 32888
datasize: 8
- cmd: LC_DATA_IN_CODE
cmdsize: 16
dataoff: 32896
datasize: 0
- cmd: LC_CODE_SIGNATURE
cmdsize: 16
dataoff: 32960
datasize: 416
LinkEditData:
ExportTrie:
TerminalSize: 0
NodeOffset: 0
Name: ''
Flags: 0x0
Address: 0x0
Other: 0x0
ImportName: ''
Children:
- TerminalSize: 3
NodeOffset: 13
Name: _sayB
Flags: 0x0
Address: 0x3F70
Other: 0x0
ImportName: ''
NameList:
- n_strx: 2
n_type: 0xF
n_sect: 1
n_desc: 0
n_value: 16240
- n_strx: 8
n_type: 0x1
n_sect: 0
n_desc: 256
n_value: 0
StringTable:
- ' '
- _sayB
- _printf
IndirectSymbols: [ 0x1, 0x1 ]
FunctionStarts: [ 0x3F70 ]
ChainedFixups: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x48,
0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x1, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x40, 0x6, 0x0,
0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5F, 0x70, 0x72,
0x69, 0x6E, 0x74, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0 ]
- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x100000C
cpusubtype: 0x80000002
filetype: 0x6
ncmds: 15
sizeofcmds: 976
flags: 0x100085
reserved: 0x0
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 392
segname: __TEXT
vmaddr: 0
vmsize: 16384
fileoff: 0
filesize: 16384
maxprot: 5
initprot: 5
nsects: 4
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x3F68
size: 32
offset: 0x3F68
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000400
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 7F2303D5FD7BBFA9FD0300910000009000603E9103000094FD7BC1A8FF0F5FD6
- sectname: __auth_stubs
segname: __TEXT
addr: 0x3F88
size: 16
offset: 0x3F88
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000408
reserved1: 0x0
reserved2: 0x10
reserved3: 0x0
content: 110000B031020091300240F9110A1FD7
- sectname: __cstring
segname: __TEXT
addr: 0x3F98
size: 14
offset: 0x3F98
align: 0
reloff: 0x0
nreloc: 0
flags: 0x2
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 48656C6C6F2066726F6D20420A00
- sectname: __unwind_info
segname: __TEXT
addr: 0x3FA8
size: 88
offset: 0x3FA8
align: 2
reloff: 0x0
nreloc: 0
flags: 0x0
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 010000001C000000000000001C000000000000001C00000002000000683F00004000000040000000883F00000000000040000000000000000000000000000000030000000C00010010000100000000000000000400000000
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DATA_CONST
vmaddr: 16384
vmsize: 16384
fileoff: 16384
filesize: 16384
maxprot: 3
initprot: 3
nsects: 1
flags: 16
Sections:
- sectname: __auth_got
segname: __DATA_CONST
addr: 0x4000
size: 8
offset: 0x4000
align: 3
reloff: 0x0
nreloc: 0
flags: 0x6
reserved1: 0x1
reserved2: 0x0
reserved3: 0x0
content: 00000000000001C0
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __LINKEDIT
vmaddr: 32768
vmsize: 16384
fileoff: 32768
filesize: 608
maxprot: 1
initprot: 1
nsects: 0
flags: 0
- cmd: LC_ID_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 1
current_version: 0
compatibility_version: 0
Content: '@rpath/libB.dylib'
ZeroPadBytes: 7
- cmd: LC_DYLD_CHAINED_FIXUPS
cmdsize: 16
dataoff: 32768
datasize: 96
- cmd: LC_DYLD_EXPORTS_TRIE
cmdsize: 16
dataoff: 32864
datasize: 24
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 32896
nsyms: 2
stroff: 32936
strsize: 16
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 0
iextdefsym: 0
nextdefsym: 1
iundefsym: 1
nundefsym: 1
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 32928
nindirectsyms: 2
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
- cmd: LC_UUID
cmdsize: 24
uuid: 76B41B3A-00EC-388B-A432-478A96772CC4
- cmd: LC_BUILD_VERSION
cmdsize: 32
platform: 1
minos: 983040
sdk: 983552
ntools: 1
Tools:
- tool: 3
version: 73074435
- cmd: LC_SOURCE_VERSION
cmdsize: 16
version: 0
- cmd: LC_LOAD_DYLIB
cmdsize: 56
dylib:
name: 24
timestamp: 2
current_version: 88539136
compatibility_version: 65536
Content: '/usr/lib/libSystem.B.dylib'
ZeroPadBytes: 6
- cmd: LC_FUNCTION_STARTS
cmdsize: 16
dataoff: 32888
datasize: 8
- cmd: LC_DATA_IN_CODE
cmdsize: 16
dataoff: 32896
datasize: 0
- cmd: LC_CODE_SIGNATURE
cmdsize: 16
dataoff: 32960
datasize: 416
LinkEditData:
ExportTrie:
TerminalSize: 0
NodeOffset: 0
Name: ''
Flags: 0x0
Address: 0x0
Other: 0x0
ImportName: ''
Children:
- TerminalSize: 3
NodeOffset: 13
Name: _sayB
Flags: 0x0
Address: 0x3F68
Other: 0x0
ImportName: ''
NameList:
- n_strx: 2
n_type: 0xF
n_sect: 1
n_desc: 0
n_value: 16232
- n_strx: 8
n_type: 0x1
n_sect: 0
n_desc: 256
n_value: 0
StringTable:
- ' '
- _sayB
- _printf
IndirectSymbols: [ 0x1, 0x1 ]
FunctionStarts: [ 0x3F68 ]
ChainedFixups: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x48,
0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x1, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x40, 0xC, 0x0,
0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5F, 0x70, 0x72,
0x69, 0x6E, 0x74, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0 ]
...

View File

@ -1,461 +0,0 @@
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R ]
FirstSec: .note.gnu.property
LastSec: .rela.plt
Align: 0x1000
Offset: 0x0
- Type: PT_LOAD
Flags: [ PF_X, PF_R ]
FirstSec: .init
LastSec: .fini
VAddr: 0x1000
Align: 0x1000
Offset: 0x1000
- Type: PT_LOAD
Flags: [ PF_R ]
FirstSec: .eh_frame_hdr
LastSec: .eh_frame
VAddr: 0x2000
Align: 0x1000
Offset: 0x2000
- Type: PT_LOAD
Flags: [ PF_W, PF_R ]
FirstSec: .init_array
LastSec: .bss
VAddr: 0x3E00
Align: 0x1000
Offset: 0x2E00
- Type: PT_DYNAMIC
Flags: [ PF_W, PF_R ]
FirstSec: .dynamic
LastSec: .dynamic
VAddr: 0x3E10
Align: 0x8
Offset: 0x2E10
- Type: PT_NOTE
Flags: [ PF_R ]
FirstSec: .note.gnu.property
LastSec: .note.gnu.property
VAddr: 0x2A8
Align: 0x8
Offset: 0x2A8
- Type: PT_NOTE
Flags: [ PF_R ]
FirstSec: .note.gnu.build-id
LastSec: .note.gnu.build-id
VAddr: 0x2C8
Align: 0x4
Offset: 0x2C8
- Type: PT_GNU_PROPERTY
Flags: [ PF_R ]
FirstSec: .note.gnu.property
LastSec: .note.gnu.property
VAddr: 0x2A8
Align: 0x8
Offset: 0x2A8
- Type: PT_GNU_EH_FRAME
Flags: [ PF_R ]
FirstSec: .eh_frame_hdr
LastSec: .eh_frame_hdr
VAddr: 0x2000
Align: 0x4
Offset: 0x2000
- Type: PT_GNU_STACK
Flags: [ PF_W, PF_R ]
Align: 0x10
Offset: 0x0
- Type: PT_GNU_RELRO
Flags: [ PF_R ]
FirstSec: .init_array
LastSec: .got
VAddr: 0x3E00
Offset: 0x2E00
Sections:
- Name: .note.gnu.property
Type: SHT_NOTE
Flags: [ SHF_ALLOC ]
Address: 0x2A8
AddressAlign: 0x8
Notes:
- Name: GNU
Desc: 020000C0040000000300000000000000
Type: NT_GNU_PROPERTY_TYPE_0
- Name: .note.gnu.build-id
Type: SHT_NOTE
Flags: [ SHF_ALLOC ]
Address: 0x2C8
AddressAlign: 0x4
Notes:
- Name: GNU
Desc: C5C3C9594A5D3556DC54D70850C6DBC316710857
Type: NT_PRPSINFO
- Name: .gnu.hash
Type: SHT_GNU_HASH
Flags: [ SHF_ALLOC ]
Address: 0x2F0
Link: .dynsym
AddressAlign: 0x8
Header:
SymNdx: 0x9
Shift2: 0x6
BloomFilter: [ 0x400000200000 ]
HashBuckets: [ 0x0, 0x9 ]
HashValues: [ 0x7C9DCB95 ]
- Name: .dynsym
Type: SHT_DYNSYM
Flags: [ SHF_ALLOC ]
Address: 0x318
Link: .dynstr
AddressAlign: 0x8
- Name: .dynstr
Type: SHT_STRTAB
Flags: [ SHF_ALLOC ]
Address: 0x408
AddressAlign: 0x1
Content: "6C6962412E736F006C6962422E736F006C6962442E736F006C69625A2E736F00244F524947494E2F2E2E2F413A244F524947494E2F2E2E2F423A244F524947494E2F2E2E2F443A244F524947494E2F2E2E2F5A"
- Name: .rela.dyn
Type: SHT_RELA
Flags: [ SHF_ALLOC ]
Address: 0x4D0
Link: .dynsym
AddressAlign: 0x8
Relocations:
- Offset: 0x3E00
Type: R_X86_64_RELATIVE
Addend: 4464
- Offset: 0x3E08
Type: R_X86_64_RELATIVE
Addend: 4400
- Offset: 0x4038
Type: R_X86_64_RELATIVE
Addend: 16440
- Offset: 0x3FE0
Symbol: __cxa_finalize
Type: R_X86_64_GLOB_DAT
- Offset: 0x3FE8
Symbol: _ITM_registerTMCloneTable
Type: R_X86_64_GLOB_DAT
- Offset: 0x3FF0
Symbol: _ITM_deregisterTMCloneTable
Type: R_X86_64_GLOB_DAT
- Offset: 0x3FF8
Symbol: __gmon_start__
Type: R_X86_64_GLOB_DAT
- Name: .rela.plt
Type: SHT_RELA
Flags: [ SHF_ALLOC, SHF_INFO_LINK ]
Address: 0x578
Link: .dynsym
AddressAlign: 0x8
Info: .got.plt
Relocations:
- Offset: 0x4018
Symbol: sayD
Type: R_X86_64_JUMP_SLOT
- Offset: 0x4020
Symbol: sayA
Type: R_X86_64_JUMP_SLOT
- Offset: 0x4028
Symbol: sayB
Type: R_X86_64_JUMP_SLOT
- Offset: 0x4030
Symbol: sayZ
Type: R_X86_64_JUMP_SLOT
- Name: .init
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1000
AddressAlign: 0x4
Offset: 0x1000
Content: F30F1EFA4883EC08488B05E92F00004885C07402FFD04883C408C3
- Name: .plt
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1020
AddressAlign: 0x10
EntSize: 0x10
Content: FF35E22F0000F2FF25E32F00000F1F00F30F1EFA6800000000F2E9E1FFFFFF90F30F1EFA6801000000F2E9D1FFFFFF90F30F1EFA6802000000F2E9C1FFFFFF90F30F1EFA6803000000F2E9B1FFFFFF90
- Name: .plt.got
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1070
AddressAlign: 0x10
EntSize: 0x10
Content: F30F1EFAF2FF25652F00000F1F440000
- Name: .plt.sec
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1080
AddressAlign: 0x10
EntSize: 0x10
Content: F30F1EFAF2FF258D2F00000F1F440000F30F1EFAF2FF25852F00000F1F440000F30F1EFAF2FF257D2F00000F1F440000F30F1EFAF2FF25752F00000F1F440000
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x10C0
AddressAlign: 0x10
Content: 488D3D792F0000488D05722F00004839F87415488B05162F00004885C07409FFE00F1F8000000000C30F1F8000000000488D3D492F0000488D35422F00004829FE4889F048C1EE3F48C1F8034801C648D1FE7414488B05CD2E00004885C07408FFE0660F1F440000C30F1F8000000000F30F1EFA803D052F000000752B5548833D9A2E0000004889E5740C488B3DE62E0000E819FFFFFFE864FFFFFFC605DD2E0000015DC30F1F00C30F1F8000000000F30F1EFAE977FFFFFFF30F1EFA554889E5B800000000E805FFFFFFB800000000E80BFFFFFFB800000000E8E1FEFFFFB800000000E807FFFFFF905DC3
- Name: .fini
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x11AC
AddressAlign: 0x4
Content: F30F1EFA4883EC084883C408C3
- Name: .eh_frame_hdr
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x2000
AddressAlign: 0x4
Offset: 0x2000
Content: 011B033B2C0000000400000020F0FFFF4800000070F0FFFF7000000080F0FFFF8800000079F1FFFFA0000000
- Name: .eh_frame
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x2030
AddressAlign: 0x8
Content: 1400000000000000017A5200017810011B0C070890010000240000001C000000D0EFFFFF50000000000E10460E184A0F0B770880003F1A3A2A332422000000001400000044000000F8EFFFFF100000000000000000000000140000005C000000F0EFFFFF4000000000000000000000001C00000074000000D1F0FFFF3300000000450E108602430D066A0C070800000000000000
- Name: .init_array
Type: SHT_INIT_ARRAY
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3E00
AddressAlign: 0x8
EntSize: 0x8
Offset: 0x2E00
Content: '7011000000000000'
- Name: .fini_array
Type: SHT_FINI_ARRAY
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3E08
AddressAlign: 0x8
EntSize: 0x8
Content: '3011000000000000'
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3E10
Link: .dynstr
AddressAlign: 0x8
Entries:
- Tag: DT_NEEDED
Value: 0x0
- Tag: DT_NEEDED
Value: 0x8
- Tag: DT_NEEDED
Value: 0x10
- Tag: DT_NEEDED
Value: 0x18
- Tag: DT_RUNPATH
Value: 0x20
- Tag: DT_INIT
Value: 0x1000
- Tag: DT_FINI
Value: 0x11AC
- Tag: DT_INIT_ARRAY
Value: 0x3E00
- Tag: DT_INIT_ARRAYSZ
Value: 0x8
- Tag: DT_FINI_ARRAY
Value: 0x3E08
- Tag: DT_FINI_ARRAYSZ
Value: 0x8
- Tag: DT_GNU_HASH
Value: 0x2F0
- Tag: DT_STRTAB
Value: 0x408
- Tag: DT_SYMTAB
Value: 0x318
- Tag: DT_STRSZ
Value: 0xC2
- Tag: DT_SYMENT
Value: 0x18
- Tag: DT_PLTGOT
Value: 0x4000
- Tag: DT_PLTRELSZ
Value: 0x60
- Tag: DT_PLTREL
Value: 0x7
- Tag: DT_JMPREL
Value: 0x578
- Tag: DT_RELA
Value: 0x4D0
- Tag: DT_RELASZ
Value: 0xA8
- Tag: DT_RELAENT
Value: 0x18
- Tag: DT_RELACOUNT
Value: 0x3
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Name: .got
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3FE0
AddressAlign: 0x8
EntSize: 0x8
Content: '0000000000000000000000000000000000000000000000000000000000000000'
- Name: .got.plt
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x4000
AddressAlign: 0x8
EntSize: 0x8
Content: '103E000000000000000000000000000000000000000000003010000000000000401000000000000050100000000000006010000000000000'
- Name: .data
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x4038
AddressAlign: 0x8
Content: '3840000000000000'
- Name: .bss
Type: SHT_NOBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x4040
AddressAlign: 0x1
Size: 0x8
- Name: .comment
Type: SHT_PROGBITS
Flags: [ SHF_MERGE, SHF_STRINGS ]
AddressAlign: 0x1
EntSize: 0x1
Content: 4743433A20285562756E74752031312E342E302D317562756E7475317E32322E30342E32292031312E342E3000
Symbols:
- Name: crtstuff.c
Type: STT_FILE
Index: SHN_ABS
- Name: deregister_tm_clones
Type: STT_FUNC
Section: .text
Value: 0x10C0
- Name: register_tm_clones
Type: STT_FUNC
Section: .text
Value: 0x10F0
- Name: __do_global_dtors_aux
Type: STT_FUNC
Section: .text
Value: 0x1130
- Name: completed.0
Type: STT_OBJECT
Section: .bss
Value: 0x4040
Size: 0x1
- Name: __do_global_dtors_aux_fini_array_entry
Type: STT_OBJECT
Section: .fini_array
Value: 0x3E08
- Name: frame_dummy
Type: STT_FUNC
Section: .text
Value: 0x1170
- Name: __frame_dummy_init_array_entry
Type: STT_OBJECT
Section: .init_array
Value: 0x3E00
- Name: libC.c
Type: STT_FILE
Index: SHN_ABS
- Name: 'crtstuff.c (1)'
Type: STT_FILE
Index: SHN_ABS
- Name: __FRAME_END__
Type: STT_OBJECT
Section: .eh_frame
Value: 0x20C0
- Type: STT_FILE
Index: SHN_ABS
- Name: _DYNAMIC
Type: STT_OBJECT
Section: .dynamic
Value: 0x3E10
- Name: __TMC_END__
Type: STT_OBJECT
Section: .data
Value: 0x4040
- Name: __dso_handle
Type: STT_OBJECT
Section: .data
Value: 0x4038
- Name: _init
Type: STT_FUNC
Section: .init
Value: 0x1000
- Name: __GNU_EH_FRAME_HDR
Section: .eh_frame_hdr
Value: 0x2000
- Name: _fini
Type: STT_FUNC
Section: .fini
Value: 0x11AC
- Name: _GLOBAL_OFFSET_TABLE_
Type: STT_OBJECT
Section: .got.plt
Value: 0x4000
- Name: sayD
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: __cxa_finalize
Binding: STB_WEAK
- Name: sayC
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
Value: 0x1179
Size: 0x33
- Name: _ITM_registerTMCloneTable
Binding: STB_WEAK
- Name: _ITM_deregisterTMCloneTable
Binding: STB_WEAK
- Name: sayA
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: sayB
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: sayZ
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: __gmon_start__
Binding: STB_WEAK
DynamicSymbols:
- Name: sayD
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: __cxa_finalize
Binding: STB_WEAK
- Name: _ITM_registerTMCloneTable
Binding: STB_WEAK
- Name: _ITM_deregisterTMCloneTable
Binding: STB_WEAK
- Name: sayA
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: sayB
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: sayZ
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: __gmon_start__
Binding: STB_WEAK
- Name: sayC
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
Value: 0x1179
Size: 0x33
...

View File

@ -1,915 +0,0 @@
--- !fat-mach-o
FatHeader:
magic: 0xCAFEBABE
nfat_arch: 3
FatArchs:
- cputype: 0x1000007
cpusubtype: 0x3
offset: 0x1000
size: 8488
align: 12
- cputype: 0x100000C
cpusubtype: 0x0
offset: 0x4000
size: 33488
align: 14
- cputype: 0x100000C
cpusubtype: 0x80000002
offset: 0x10000
size: 33488
align: 14
Slices:
- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x1000007
cpusubtype: 0x3
filetype: 0x6
ncmds: 22
sizeofcmds: 1200
flags: 0x100085
reserved: 0x0
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 312
segname: __TEXT
vmaddr: 0
vmsize: 4096
fileoff: 0
filesize: 4096
maxprot: 5
initprot: 5
nsects: 3
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0xF60
size: 34
offset: 0xF60
align: 4
reloff: 0x0
nreloc: 0
flags: 0x80000400
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 554889E5B000E817000000B000E816000000B000E815000000B000E8140000005DC3
- sectname: __stubs
segname: __TEXT
addr: 0xF82
size: 24
offset: 0xF82
align: 1
reloff: 0x0
nreloc: 0
flags: 0x80000408
reserved1: 0x0
reserved2: 0x6
reserved3: 0x0
content: FF2578000000FF257A000000FF257C000000FF257E000000
- sectname: __unwind_info
segname: __TEXT
addr: 0xF9C
size: 88
offset: 0xF9C
align: 2
reloff: 0x0
nreloc: 0
flags: 0x0
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 010000001C000000000000001C000000000000001C00000002000000600F00004000000040000000820F00000000000040000000000000000000000000000000030000000C00010010000100000000000000000100000000
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DATA_CONST
vmaddr: 4096
vmsize: 4096
fileoff: 4096
filesize: 4096
maxprot: 3
initprot: 3
nsects: 1
flags: 16
Sections:
- sectname: __got
segname: __DATA_CONST
addr: 0x1000
size: 32
offset: 0x1000
align: 3
reloff: 0x0
nreloc: 0
flags: 0x6
reserved1: 0x4
reserved2: 0x0
reserved3: 0x0
content: '0000000000001080010000000000108002000000000010800300000000000080'
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __LINKEDIT
vmaddr: 8192
vmsize: 4096
fileoff: 8192
filesize: 296
maxprot: 1
initprot: 1
nsects: 0
flags: 0
- cmd: LC_ID_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 1
current_version: 0
compatibility_version: 0
Content: '@rpath/libC.dylib'
ZeroPadBytes: 7
- cmd: LC_DYLD_CHAINED_FIXUPS
cmdsize: 16
dataoff: 8192
datasize: 120
- cmd: LC_DYLD_EXPORTS_TRIE
cmdsize: 16
dataoff: 8312
datasize: 24
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 8344
nsyms: 5
stroff: 8456
strsize: 32
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 0
iextdefsym: 0
nextdefsym: 1
iundefsym: 1
nundefsym: 4
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 8424
nindirectsyms: 8
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
- cmd: LC_UUID
cmdsize: 24
uuid: 2A1F4EC3-CD6C-3293-9D2B-5D8E42FE51EF
- cmd: LC_BUILD_VERSION
cmdsize: 32
platform: 1
minos: 983040
sdk: 983552
ntools: 1
Tools:
- tool: 3
version: 73074435
- cmd: LC_SOURCE_VERSION
cmdsize: 16
version: 0
- cmd: LC_LOAD_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 2
current_version: 0
compatibility_version: 0
Content: '@rpath/libA.dylib'
ZeroPadBytes: 7
- cmd: LC_LOAD_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 2
current_version: 0
compatibility_version: 0
Content: '@rpath/libB.dylib'
ZeroPadBytes: 7
- cmd: LC_LOAD_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 2
current_version: 0
compatibility_version: 0
Content: '@rpath/libD.dylib'
ZeroPadBytes: 7
- cmd: LC_LOAD_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 2
current_version: 0
compatibility_version: 0
Content: '@rpath/libZ.dylib'
ZeroPadBytes: 7
- cmd: LC_LOAD_DYLIB
cmdsize: 56
dylib:
name: 24
timestamp: 2
current_version: 88539136
compatibility_version: 65536
Content: '/usr/lib/libSystem.B.dylib'
ZeroPadBytes: 6
- cmd: LC_RPATH
cmdsize: 32
path: 12
Content: '@loader_path/../A'
ZeroPadBytes: 3
- cmd: LC_RPATH
cmdsize: 32
path: 12
Content: '@loader_path/../B'
ZeroPadBytes: 3
- cmd: LC_RPATH
cmdsize: 32
path: 12
Content: '@loader_path/../D'
ZeroPadBytes: 3
- cmd: LC_RPATH
cmdsize: 32
path: 12
Content: '@loader_path/../Z'
ZeroPadBytes: 3
- cmd: LC_FUNCTION_STARTS
cmdsize: 16
dataoff: 8336
datasize: 8
- cmd: LC_DATA_IN_CODE
cmdsize: 16
dataoff: 8344
datasize: 0
LinkEditData:
ExportTrie:
TerminalSize: 0
NodeOffset: 0
Name: ''
Flags: 0x0
Address: 0x0
Other: 0x0
ImportName: ''
Children:
- TerminalSize: 3
NodeOffset: 13
Name: _sayC
Flags: 0x0
Address: 0xF60
Other: 0x0
ImportName: ''
NameList:
- n_strx: 2
n_type: 0xF
n_sect: 1
n_desc: 0
n_value: 3936
- n_strx: 8
n_type: 0x1
n_sect: 0
n_desc: 256
n_value: 0
- n_strx: 14
n_type: 0x1
n_sect: 0
n_desc: 512
n_value: 0
- n_strx: 20
n_type: 0x1
n_sect: 0
n_desc: 768
n_value: 0
- n_strx: 26
n_type: 0x1
n_sect: 0
n_desc: 1024
n_value: 0
StringTable:
- ' '
- _sayC
- _sayA
- _sayB
- _sayD
- _sayZ
IndirectSymbols: [ 0x1, 0x2, 0x3, 0x4, 0x1, 0x2, 0x3, 0x4 ]
FunctionStarts: [ 0xF60 ]
ChainedFixups: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x48,
0x0, 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, 0x4, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x10, 0x6, 0x0,
0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x0,
0x0, 0x2, 0xE, 0x0, 0x0, 0x3, 0x1A, 0x0, 0x0,
0x4, 0x26, 0x0, 0x0, 0x0, 0x5F, 0x73, 0x61, 0x79,
0x41, 0x0, 0x5F, 0x73, 0x61, 0x79, 0x42, 0x0,
0x5F, 0x73, 0x61, 0x79, 0x44, 0x0, 0x5F, 0x73,
0x61, 0x79, 0x5A, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0 ]
- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x100000C
cpusubtype: 0x0
filetype: 0x6
ncmds: 23
sizeofcmds: 1216
flags: 0x100085
reserved: 0x0
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 312
segname: __TEXT
vmaddr: 0
vmsize: 16384
fileoff: 0
filesize: 16384
maxprot: 5
initprot: 5
nsects: 3
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x3F58
size: 32
offset: 0x3F58
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000400
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: FD7BBFA9FD03009106000094080000940A0000940C000094FD7BC1A8C0035FD6
- sectname: __stubs
segname: __TEXT
addr: 0x3F78
size: 48
offset: 0x3F78
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000408
reserved1: 0x0
reserved2: 0xC
reserved3: 0x0
content: 100000B0100240F900021FD6100000B0100640F900021FD6100000B0100A40F900021FD6100000B0100E40F900021FD6
- sectname: __unwind_info
segname: __TEXT
addr: 0x3FA8
size: 88
offset: 0x3FA8
align: 2
reloff: 0x0
nreloc: 0
flags: 0x0
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 010000001C000000000000001C000000000000001C00000002000000583F00004000000040000000783F00000000000040000000000000000000000000000000030000000C00010010000100000000000000000400000000
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DATA_CONST
vmaddr: 16384
vmsize: 16384
fileoff: 16384
filesize: 16384
maxprot: 3
initprot: 3
nsects: 1
flags: 16
Sections:
- sectname: __got
segname: __DATA_CONST
addr: 0x4000
size: 32
offset: 0x4000
align: 3
reloff: 0x0
nreloc: 0
flags: 0x6
reserved1: 0x4
reserved2: 0x0
reserved3: 0x0
content: '0000000000001080010000000000108002000000000010800300000000000080'
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __LINKEDIT
vmaddr: 32768
vmsize: 16384
fileoff: 32768
filesize: 720
maxprot: 1
initprot: 1
nsects: 0
flags: 0
- cmd: LC_ID_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 1
current_version: 0
compatibility_version: 0
Content: '@rpath/libC.dylib'
ZeroPadBytes: 7
- cmd: LC_DYLD_CHAINED_FIXUPS
cmdsize: 16
dataoff: 32768
datasize: 120
- cmd: LC_DYLD_EXPORTS_TRIE
cmdsize: 16
dataoff: 32888
datasize: 24
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 32920
nsyms: 5
stroff: 33032
strsize: 32
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 0
iextdefsym: 0
nextdefsym: 1
iundefsym: 1
nundefsym: 4
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 33000
nindirectsyms: 8
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
- cmd: LC_UUID
cmdsize: 24
uuid: 6DE75070-D632-398D-8BB5-06C8C8B29147
- cmd: LC_BUILD_VERSION
cmdsize: 32
platform: 1
minos: 983040
sdk: 983552
ntools: 1
Tools:
- tool: 3
version: 73074435
- cmd: LC_SOURCE_VERSION
cmdsize: 16
version: 0
- cmd: LC_LOAD_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 2
current_version: 0
compatibility_version: 0
Content: '@rpath/libA.dylib'
ZeroPadBytes: 7
- cmd: LC_LOAD_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 2
current_version: 0
compatibility_version: 0
Content: '@rpath/libB.dylib'
ZeroPadBytes: 7
- cmd: LC_LOAD_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 2
current_version: 0
compatibility_version: 0
Content: '@rpath/libD.dylib'
ZeroPadBytes: 7
- cmd: LC_LOAD_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 2
current_version: 0
compatibility_version: 0
Content: '@rpath/libZ.dylib'
ZeroPadBytes: 7
- cmd: LC_LOAD_DYLIB
cmdsize: 56
dylib:
name: 24
timestamp: 2
current_version: 88539136
compatibility_version: 65536
Content: '/usr/lib/libSystem.B.dylib'
ZeroPadBytes: 6
- cmd: LC_RPATH
cmdsize: 32
path: 12
Content: '@loader_path/../A'
ZeroPadBytes: 3
- cmd: LC_RPATH
cmdsize: 32
path: 12
Content: '@loader_path/../B'
ZeroPadBytes: 3
- cmd: LC_RPATH
cmdsize: 32
path: 12
Content: '@loader_path/../D'
ZeroPadBytes: 3
- cmd: LC_RPATH
cmdsize: 32
path: 12
Content: '@loader_path/../Z'
ZeroPadBytes: 3
- cmd: LC_FUNCTION_STARTS
cmdsize: 16
dataoff: 32912
datasize: 8
- cmd: LC_DATA_IN_CODE
cmdsize: 16
dataoff: 32920
datasize: 0
- cmd: LC_CODE_SIGNATURE
cmdsize: 16
dataoff: 33072
datasize: 416
LinkEditData:
ExportTrie:
TerminalSize: 0
NodeOffset: 0
Name: ''
Flags: 0x0
Address: 0x0
Other: 0x0
ImportName: ''
Children:
- TerminalSize: 3
NodeOffset: 13
Name: _sayC
Flags: 0x0
Address: 0x3F58
Other: 0x0
ImportName: ''
NameList:
- n_strx: 2
n_type: 0xF
n_sect: 1
n_desc: 0
n_value: 16216
- n_strx: 8
n_type: 0x1
n_sect: 0
n_desc: 256
n_value: 0
- n_strx: 14
n_type: 0x1
n_sect: 0
n_desc: 512
n_value: 0
- n_strx: 20
n_type: 0x1
n_sect: 0
n_desc: 768
n_value: 0
- n_strx: 26
n_type: 0x1
n_sect: 0
n_desc: 1024
n_value: 0
StringTable:
- ' '
- _sayC
- _sayA
- _sayB
- _sayD
- _sayZ
IndirectSymbols: [ 0x1, 0x2, 0x3, 0x4, 0x1, 0x2, 0x3, 0x4 ]
FunctionStarts: [ 0x3F58 ]
ChainedFixups: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x48,
0x0, 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, 0x4, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x40, 0x6, 0x0,
0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x0,
0x0, 0x2, 0xE, 0x0, 0x0, 0x3, 0x1A, 0x0, 0x0,
0x4, 0x26, 0x0, 0x0, 0x0, 0x5F, 0x73, 0x61, 0x79,
0x41, 0x0, 0x5F, 0x73, 0x61, 0x79, 0x42, 0x0,
0x5F, 0x73, 0x61, 0x79, 0x44, 0x0, 0x5F, 0x73,
0x61, 0x79, 0x5A, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0 ]
- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x100000C
cpusubtype: 0x80000002
filetype: 0x6
ncmds: 23
sizeofcmds: 1216
flags: 0x100085
reserved: 0x0
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 312
segname: __TEXT
vmaddr: 0
vmsize: 16384
fileoff: 0
filesize: 16384
maxprot: 5
initprot: 5
nsects: 3
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x3F44
size: 36
offset: 0x3F44
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000400
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 7F2303D5FD7BBFA9FD03009106000094090000940C0000940F000094FD7BC1A8FF0F5FD6
- sectname: __auth_stubs
segname: __TEXT
addr: 0x3F68
size: 64
offset: 0x3F68
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000408
reserved1: 0x0
reserved2: 0x10
reserved3: 0x0
content: 110000B031020091300240F9110A1FD7110000B031220091300240F9110A1FD7110000B031420091300240F9110A1FD7110000B031620091300240F9110A1FD7
- sectname: __unwind_info
segname: __TEXT
addr: 0x3FA8
size: 88
offset: 0x3FA8
align: 2
reloff: 0x0
nreloc: 0
flags: 0x0
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 010000001C000000000000001C000000000000001C00000002000000443F00004000000040000000683F00000000000040000000000000000000000000000000030000000C00010010000100000000000000000400000000
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DATA_CONST
vmaddr: 16384
vmsize: 16384
fileoff: 16384
filesize: 16384
maxprot: 3
initprot: 3
nsects: 1
flags: 16
Sections:
- sectname: __auth_got
segname: __DATA_CONST
addr: 0x4000
size: 32
offset: 0x4000
align: 3
reloff: 0x0
nreloc: 0
flags: 0x6
reserved1: 0x4
reserved2: 0x0
reserved3: 0x0
content: 00000000000009C001000000000009C002000000000009C003000000000001C0
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __LINKEDIT
vmaddr: 32768
vmsize: 16384
fileoff: 32768
filesize: 720
maxprot: 1
initprot: 1
nsects: 0
flags: 0
- cmd: LC_ID_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 1
current_version: 0
compatibility_version: 0
Content: '@rpath/libC.dylib'
ZeroPadBytes: 7
- cmd: LC_DYLD_CHAINED_FIXUPS
cmdsize: 16
dataoff: 32768
datasize: 120
- cmd: LC_DYLD_EXPORTS_TRIE
cmdsize: 16
dataoff: 32888
datasize: 24
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 32920
nsyms: 5
stroff: 33032
strsize: 32
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 0
iextdefsym: 0
nextdefsym: 1
iundefsym: 1
nundefsym: 4
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 33000
nindirectsyms: 8
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
- cmd: LC_UUID
cmdsize: 24
uuid: C1E8A3F5-14B1-3BF2-B737-18AB98364487
- cmd: LC_BUILD_VERSION
cmdsize: 32
platform: 1
minos: 983040
sdk: 983552
ntools: 1
Tools:
- tool: 3
version: 73074435
- cmd: LC_SOURCE_VERSION
cmdsize: 16
version: 0
- cmd: LC_LOAD_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 2
current_version: 0
compatibility_version: 0
Content: '@rpath/libA.dylib'
ZeroPadBytes: 7
- cmd: LC_LOAD_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 2
current_version: 0
compatibility_version: 0
Content: '@rpath/libB.dylib'
ZeroPadBytes: 7
- cmd: LC_LOAD_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 2
current_version: 0
compatibility_version: 0
Content: '@rpath/libD.dylib'
ZeroPadBytes: 7
- cmd: LC_LOAD_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 2
current_version: 0
compatibility_version: 0
Content: '@rpath/libZ.dylib'
ZeroPadBytes: 7
- cmd: LC_LOAD_DYLIB
cmdsize: 56
dylib:
name: 24
timestamp: 2
current_version: 88539136
compatibility_version: 65536
Content: '/usr/lib/libSystem.B.dylib'
ZeroPadBytes: 6
- cmd: LC_RPATH
cmdsize: 32
path: 12
Content: '@loader_path/../A'
ZeroPadBytes: 3
- cmd: LC_RPATH
cmdsize: 32
path: 12
Content: '@loader_path/../B'
ZeroPadBytes: 3
- cmd: LC_RPATH
cmdsize: 32
path: 12
Content: '@loader_path/../D'
ZeroPadBytes: 3
- cmd: LC_RPATH
cmdsize: 32
path: 12
Content: '@loader_path/../Z'
ZeroPadBytes: 3
- cmd: LC_FUNCTION_STARTS
cmdsize: 16
dataoff: 32912
datasize: 8
- cmd: LC_DATA_IN_CODE
cmdsize: 16
dataoff: 32920
datasize: 0
- cmd: LC_CODE_SIGNATURE
cmdsize: 16
dataoff: 33072
datasize: 416
LinkEditData:
ExportTrie:
TerminalSize: 0
NodeOffset: 0
Name: ''
Flags: 0x0
Address: 0x0
Other: 0x0
ImportName: ''
Children:
- TerminalSize: 3
NodeOffset: 13
Name: _sayC
Flags: 0x0
Address: 0x3F44
Other: 0x0
ImportName: ''
NameList:
- n_strx: 2
n_type: 0xF
n_sect: 1
n_desc: 0
n_value: 16196
- n_strx: 8
n_type: 0x1
n_sect: 0
n_desc: 256
n_value: 0
- n_strx: 14
n_type: 0x1
n_sect: 0
n_desc: 512
n_value: 0
- n_strx: 20
n_type: 0x1
n_sect: 0
n_desc: 768
n_value: 0
- n_strx: 26
n_type: 0x1
n_sect: 0
n_desc: 1024
n_value: 0
StringTable:
- ' '
- _sayC
- _sayA
- _sayB
- _sayD
- _sayZ
IndirectSymbols: [ 0x1, 0x2, 0x3, 0x4, 0x1, 0x2, 0x3, 0x4 ]
FunctionStarts: [ 0x3F44 ]
ChainedFixups: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x48,
0x0, 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, 0x4, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x40, 0xC, 0x0,
0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x0,
0x0, 0x2, 0xE, 0x0, 0x0, 0x3, 0x1A, 0x0, 0x0,
0x4, 0x26, 0x0, 0x0, 0x0, 0x5F, 0x73, 0x61, 0x79,
0x41, 0x0, 0x5F, 0x73, 0x61, 0x79, 0x42, 0x0,
0x5F, 0x73, 0x61, 0x79, 0x44, 0x0, 0x5F, 0x73,
0x61, 0x79, 0x5A, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0 ]
...

View File

@ -1,479 +0,0 @@
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R ]
FirstSec: .note.gnu.property
LastSec: .rela.plt
Align: 0x1000
Offset: 0x0
- Type: PT_LOAD
Flags: [ PF_X, PF_R ]
FirstSec: .init
LastSec: .fini
VAddr: 0x1000
Align: 0x1000
Offset: 0x1000
- Type: PT_LOAD
Flags: [ PF_R ]
FirstSec: .rodata
LastSec: .eh_frame
VAddr: 0x2000
Align: 0x1000
Offset: 0x2000
- Type: PT_LOAD
Flags: [ PF_W, PF_R ]
FirstSec: .init_array
LastSec: .bss
VAddr: 0x3DF0
Align: 0x1000
Offset: 0x2DF0
- Type: PT_DYNAMIC
Flags: [ PF_W, PF_R ]
FirstSec: .dynamic
LastSec: .dynamic
VAddr: 0x3E00
Align: 0x8
Offset: 0x2E00
- Type: PT_NOTE
Flags: [ PF_R ]
FirstSec: .note.gnu.property
LastSec: .note.gnu.property
VAddr: 0x2A8
Align: 0x8
Offset: 0x2A8
- Type: PT_NOTE
Flags: [ PF_R ]
FirstSec: .note.gnu.build-id
LastSec: .note.gnu.build-id
VAddr: 0x2C8
Align: 0x4
Offset: 0x2C8
- Type: PT_GNU_PROPERTY
Flags: [ PF_R ]
FirstSec: .note.gnu.property
LastSec: .note.gnu.property
VAddr: 0x2A8
Align: 0x8
Offset: 0x2A8
- Type: PT_GNU_EH_FRAME
Flags: [ PF_R ]
FirstSec: .eh_frame_hdr
LastSec: .eh_frame_hdr
VAddr: 0x2010
Align: 0x4
Offset: 0x2010
- Type: PT_GNU_STACK
Flags: [ PF_W, PF_R ]
Align: 0x10
Offset: 0x0
- Type: PT_GNU_RELRO
Flags: [ PF_R ]
FirstSec: .init_array
LastSec: .got
VAddr: 0x3DF0
Offset: 0x2DF0
Sections:
- Name: .note.gnu.property
Type: SHT_NOTE
Flags: [ SHF_ALLOC ]
Address: 0x2A8
AddressAlign: 0x8
Notes:
- Name: GNU
Desc: 020000C0040000000300000000000000
Type: NT_GNU_PROPERTY_TYPE_0
- Name: .note.gnu.build-id
Type: SHT_NOTE
Flags: [ SHF_ALLOC ]
Address: 0x2C8
AddressAlign: 0x4
Notes:
- Name: GNU
Desc: 6A0CC906C743C23E1400FDD239CF755466AB3E7B
Type: NT_PRPSINFO
- Name: .gnu.hash
Type: SHT_GNU_HASH
Flags: [ SHF_ALLOC ]
Address: 0x2F0
Link: .dynsym
AddressAlign: 0x8
Header:
SymNdx: 0x7
Shift2: 0x6
BloomFilter: [ 0x400000400000 ]
HashBuckets: [ 0x7, 0x0 ]
HashValues: [ 0x7C9DCB97 ]
- Name: .dynsym
Type: SHT_DYNSYM
Flags: [ SHF_ALLOC ]
Address: 0x318
Link: .dynstr
AddressAlign: 0x8
- Name: .dynstr
Type: SHT_STRTAB
Flags: [ SHF_ALLOC ]
Address: 0x3D8
AddressAlign: 0x1
Content: "6C6962412E736F006C6962632E736F2E3600244F524947494E2F2E2E2F4100"
- Name: .gnu.version
Type: SHT_GNU_versym
Flags: [ SHF_ALLOC ]
Address: 0x468
Link: .dynsym
AddressAlign: 0x2
Entries: [ 0, 1, 2, 1, 1, 1, 2, 1 ]
- Name: .gnu.version_r
Type: SHT_GNU_verneed
Flags: [ SHF_ALLOC ]
Address: 0x478
Link: .dynstr
AddressAlign: 0x8
Dependencies:
- Version: 1
File: libc.so.6
Entries:
- Name: GLIBC_2.2.5
Hash: 157882997
Flags: 0
Other: 2
- Name: .rela.dyn
Type: SHT_RELA
Flags: [ SHF_ALLOC ]
Address: 0x498
Link: .dynsym
AddressAlign: 0x8
Relocations:
- Offset: 0x3DF0
Type: R_X86_64_RELATIVE
Addend: 4400
- Offset: 0x3DF8
Type: R_X86_64_RELATIVE
Addend: 4336
- Offset: 0x4028
Type: R_X86_64_RELATIVE
Addend: 16424
- Offset: 0x3FE0
Symbol: _ITM_deregisterTMCloneTable
Type: R_X86_64_GLOB_DAT
- Offset: 0x3FE8
Symbol: __gmon_start__
Type: R_X86_64_GLOB_DAT
- Offset: 0x3FF0
Symbol: _ITM_registerTMCloneTable
Type: R_X86_64_GLOB_DAT
- Offset: 0x3FF8
Symbol: __cxa_finalize
Type: R_X86_64_GLOB_DAT
- Name: .rela.plt
Type: SHT_RELA
Flags: [ SHF_ALLOC, SHF_INFO_LINK ]
Address: 0x540
Link: .dynsym
AddressAlign: 0x8
Info: .got.plt
Relocations:
- Offset: 0x4018
Symbol: puts
Type: R_X86_64_JUMP_SLOT
- Offset: 0x4020
Symbol: sayA
Type: R_X86_64_JUMP_SLOT
- Name: .init
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1000
AddressAlign: 0x4
Offset: 0x1000
Content: F30F1EFA4883EC08488B05D92F00004885C07402FFD04883C408C3
- Name: .plt
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1020
AddressAlign: 0x10
EntSize: 0x10
Content: FF35E22F0000F2FF25E32F00000F1F00F30F1EFA6800000000F2E9E1FFFFFF90F30F1EFA6801000000F2E9D1FFFFFF90
- Name: .plt.got
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1050
AddressAlign: 0x10
EntSize: 0x10
Content: F30F1EFAF2FF259D2F00000F1F440000
- Name: .plt.sec
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1060
AddressAlign: 0x10
EntSize: 0x10
Content: F30F1EFAF2FF25AD2F00000F1F440000F30F1EFAF2FF25A52F00000F1F440000
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1080
AddressAlign: 0x10
Content: 488D3DA92F0000488D05A22F00004839F87415488B05462F00004885C07409FFE00F1F8000000000C30F1F8000000000488D3D792F0000488D35722F00004829FE4889F048C1EE3F48C1F8034801C648D1FE7414488B05152F00004885C07408FFE0660F1F440000C30F1F8000000000F30F1EFA803D352F000000752B5548833DF22E0000004889E5740C488B3D162F0000E839FFFFFFE864FFFFFFC6050D2F0000015DC30F1F00C30F1F8000000000F30F1EFAE977FFFFFFF30F1EFA554889E5B800000000E825FFFFFF905DC3F30F1EFA554889E5488D05A30E00004889C7E8FBFEFFFF905DC3
- Name: .fini
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1168
AddressAlign: 0x4
Content: F30F1EFA4883EC084883C408C3
- Name: .rodata
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x2000
AddressAlign: 0x1
Offset: 0x2000
Content: 48656C6C6F2066726F6D20442100
- Name: .eh_frame_hdr
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x2010
AddressAlign: 0x4
Content: 011B033B340000000500000010F0FFFF5000000040F0FFFF7800000050F0FFFF9000000029F1FFFFA80000003EF1FFFFC8000000
- Name: .eh_frame
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x2048
AddressAlign: 0x8
Content: 1400000000000000017A5200017810011B0C070890010000240000001C000000B8EFFFFF30000000000E10460E184A0F0B770880003F1A3A2A332422000000001400000044000000C0EFFFFF100000000000000000000000140000005C000000B8EFFFFF2000000000000000000000001C0000007400000079F0FFFF1500000000450E108602430D064C0C07080000001C000000940000006EF0FFFF1A00000000450E108602430D06510C070800000000000000
- Name: .init_array
Type: SHT_INIT_ARRAY
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3DF0
AddressAlign: 0x8
EntSize: 0x8
Offset: 0x2DF0
Content: '3011000000000000'
- Name: .fini_array
Type: SHT_FINI_ARRAY
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3DF8
AddressAlign: 0x8
EntSize: 0x8
Content: F010000000000000
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3E00
Link: .dynstr
AddressAlign: 0x8
Entries:
- Tag: DT_NEEDED
Value: 0x00
- Tag: DT_NEEDED
Value: 0x08
- Tag: DT_RUNPATH
Value: 0x12
- Tag: DT_INIT
Value: 0x1000
- Tag: DT_FINI
Value: 0x1168
- Tag: DT_INIT_ARRAY
Value: 0x3DF0
- Tag: DT_INIT_ARRAYSZ
Value: 0x8
- Tag: DT_FINI_ARRAY
Value: 0x3DF8
- Tag: DT_FINI_ARRAYSZ
Value: 0x8
- Tag: DT_GNU_HASH
Value: 0x2F0
- Tag: DT_STRTAB
Value: 0x3D8
- Tag: DT_SYMTAB
Value: 0x318
- Tag: DT_STRSZ
Value: 0x8F
- Tag: DT_SYMENT
Value: 0x18
- Tag: DT_PLTGOT
Value: 0x4000
- Tag: DT_PLTRELSZ
Value: 0x30
- Tag: DT_PLTREL
Value: 0x7
- Tag: DT_JMPREL
Value: 0x540
- Tag: DT_RELA
Value: 0x498
- Tag: DT_RELASZ
Value: 0xA8
- Tag: DT_RELAENT
Value: 0x18
- Tag: DT_VERNEED
Value: 0x478
- Tag: DT_VERNEEDNUM
Value: 0x1
- Tag: DT_VERSYM
Value: 0x468
- Tag: DT_RELACOUNT
Value: 0x3
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Name: .got
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3FE0
AddressAlign: 0x8
EntSize: 0x8
Content: '0000000000000000000000000000000000000000000000000000000000000000'
- Name: .got.plt
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x4000
AddressAlign: 0x8
EntSize: 0x8
Content: '003E0000000000000000000000000000000000000000000030100000000000004010000000000000'
- Name: .data
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x4028
AddressAlign: 0x8
Content: '2840000000000000'
- Name: .bss
Type: SHT_NOBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x4030
AddressAlign: 0x1
Size: 0x8
- Name: .comment
Type: SHT_PROGBITS
Flags: [ SHF_MERGE, SHF_STRINGS ]
AddressAlign: 0x1
EntSize: 0x1
Content: 4743433A20285562756E74752031312E342E302D317562756E7475317E32322E30342E32292031312E342E3000
Symbols:
- Name: crtstuff.c
Type: STT_FILE
Index: SHN_ABS
- Name: deregister_tm_clones
Type: STT_FUNC
Section: .text
Value: 0x1080
- Name: register_tm_clones
Type: STT_FUNC
Section: .text
Value: 0x10B0
- Name: __do_global_dtors_aux
Type: STT_FUNC
Section: .text
Value: 0x10F0
- Name: completed.0
Type: STT_OBJECT
Section: .bss
Value: 0x4030
Size: 0x1
- Name: __do_global_dtors_aux_fini_array_entry
Type: STT_OBJECT
Section: .fini_array
Value: 0x3DF8
- Name: frame_dummy
Type: STT_FUNC
Section: .text
Value: 0x1130
- Name: __frame_dummy_init_array_entry
Type: STT_OBJECT
Section: .init_array
Value: 0x3DF0
- Name: libD.c
Type: STT_FILE
Index: SHN_ABS
- Name: keepSayA
Type: STT_FUNC
Section: .text
Value: 0x1139
Size: 0x15
- Name: 'crtstuff.c (1)'
Type: STT_FILE
Index: SHN_ABS
- Name: __FRAME_END__
Type: STT_OBJECT
Section: .eh_frame
Value: 0x20F8
- Type: STT_FILE
Index: SHN_ABS
- Name: _fini
Type: STT_FUNC
Section: .fini
Value: 0x1168
- Name: __dso_handle
Type: STT_OBJECT
Section: .data
Value: 0x4028
- Name: _DYNAMIC
Type: STT_OBJECT
Section: .dynamic
Value: 0x3E00
- Name: __GNU_EH_FRAME_HDR
Section: .eh_frame_hdr
Value: 0x2010
- Name: __TMC_END__
Type: STT_OBJECT
Section: .data
Value: 0x4030
- Name: _GLOBAL_OFFSET_TABLE_
Type: STT_OBJECT
Section: .got.plt
Value: 0x4000
- Name: _init
Type: STT_FUNC
Section: .init
Value: 0x1000
- Name: _ITM_deregisterTMCloneTable
Binding: STB_WEAK
- Name: 'puts@GLIBC_2.2.5'
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: sayA
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: __gmon_start__
Binding: STB_WEAK
- Name: sayD
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
Value: 0x114E
Size: 0x1A
- Name: _ITM_registerTMCloneTable
Binding: STB_WEAK
- Name: '__cxa_finalize@GLIBC_2.2.5'
Type: STT_FUNC
Binding: STB_WEAK
DynamicSymbols:
- Name: _ITM_deregisterTMCloneTable
Binding: STB_WEAK
- Name: puts
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: sayA
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: __gmon_start__
Binding: STB_WEAK
- Name: _ITM_registerTMCloneTable
Binding: STB_WEAK
- Name: __cxa_finalize
Type: STT_FUNC
Binding: STB_WEAK
- Name: sayD
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
Value: 0x114E
Size: 0x1A
...

View File

@ -1,801 +0,0 @@
--- !fat-mach-o
FatHeader:
magic: 0xCAFEBABE
nfat_arch: 3
FatArchs:
- cputype: 0x1000007
cpusubtype: 0x3
offset: 0x1000
size: 8432
align: 12
- cputype: 0x100000C
cpusubtype: 0x0
offset: 0x4000
size: 33424
align: 14
- cputype: 0x100000C
cpusubtype: 0x80000002
offset: 0x10000
size: 33424
align: 14
Slices:
- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x1000007
cpusubtype: 0x3
filetype: 0x6
ncmds: 16
sizeofcmds: 1040
flags: 0x100085
reserved: 0x0
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 392
segname: __TEXT
vmaddr: 0
vmsize: 4096
fileoff: 0
filesize: 4096
maxprot: 5
initprot: 5
nsects: 4
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0xF60
size: 36
offset: 0xF60
align: 4
reloff: 0x0
nreloc: 0
flags: 0x80000400
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 554889E5B000E81F0000005DC30F1F00554889E5488D3D15000000B000E8020000005DC3
- sectname: __stubs
segname: __TEXT
addr: 0xF84
size: 12
offset: 0xF84
align: 1
reloff: 0x0
nreloc: 0
flags: 0x80000408
reserved1: 0x0
reserved2: 0x6
reserved3: 0x0
content: FF2576000000FF2578000000
- sectname: __cstring
segname: __TEXT
addr: 0xF90
size: 15
offset: 0xF90
align: 0
reloff: 0x0
nreloc: 0
flags: 0x2
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 48656C6C6F2066726F6D2044210A00
- sectname: __unwind_info
segname: __TEXT
addr: 0xFA0
size: 88
offset: 0xFA0
align: 2
reloff: 0x0
nreloc: 0
flags: 0x0
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 010000001C000000000000001C000000000000001C00000002000000600F00004000000040000000840F00000000000040000000000000000000000000000000030000000C00010010000100000000000000000100000000
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DATA_CONST
vmaddr: 4096
vmsize: 4096
fileoff: 4096
filesize: 4096
maxprot: 3
initprot: 3
nsects: 1
flags: 16
Sections:
- sectname: __got
segname: __DATA_CONST
addr: 0x1000
size: 16
offset: 0x1000
align: 3
reloff: 0x0
nreloc: 0
flags: 0x6
reserved1: 0x2
reserved2: 0x0
reserved3: 0x0
content: '00000000000010800100000000000080'
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __LINKEDIT
vmaddr: 8192
vmsize: 4096
fileoff: 8192
filesize: 240
maxprot: 1
initprot: 1
nsects: 0
flags: 0
- cmd: LC_ID_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 1
current_version: 0
compatibility_version: 0
Content: '@rpath/libD.dylib'
ZeroPadBytes: 7
- cmd: LC_DYLD_CHAINED_FIXUPS
cmdsize: 16
dataoff: 8192
datasize: 96
- cmd: LC_DYLD_EXPORTS_TRIE
cmdsize: 16
dataoff: 8288
datasize: 24
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 8320
nsyms: 4
stroff: 8400
strsize: 32
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 1
iextdefsym: 1
nextdefsym: 1
iundefsym: 2
nundefsym: 2
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 8384
nindirectsyms: 4
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
- cmd: LC_UUID
cmdsize: 24
uuid: 8B5D4A65-6C4F-3D34-9294-26E03CFBD3AE
- cmd: LC_BUILD_VERSION
cmdsize: 32
platform: 1
minos: 983040
sdk: 983552
ntools: 1
Tools:
- tool: 3
version: 73074435
- cmd: LC_SOURCE_VERSION
cmdsize: 16
version: 0
- cmd: LC_LOAD_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 2
current_version: 0
compatibility_version: 0
Content: '@rpath/libA.dylib'
ZeroPadBytes: 7
- cmd: LC_LOAD_DYLIB
cmdsize: 56
dylib:
name: 24
timestamp: 2
current_version: 88539136
compatibility_version: 65536
Content: '/usr/lib/libSystem.B.dylib'
ZeroPadBytes: 6
- cmd: LC_RPATH
cmdsize: 32
path: 12
Content: '@loader_path/../A'
ZeroPadBytes: 3
- cmd: LC_FUNCTION_STARTS
cmdsize: 16
dataoff: 8312
datasize: 8
- cmd: LC_DATA_IN_CODE
cmdsize: 16
dataoff: 8320
datasize: 0
LinkEditData:
ExportTrie:
TerminalSize: 0
NodeOffset: 0
Name: ''
Flags: 0x0
Address: 0x0
Other: 0x0
ImportName: ''
Children:
- TerminalSize: 3
NodeOffset: 13
Name: _sayD
Flags: 0x0
Address: 0xF70
Other: 0x0
ImportName: ''
NameList:
- n_strx: 22
n_type: 0xE
n_sect: 1
n_desc: 0
n_value: 3936
- n_strx: 2
n_type: 0xF
n_sect: 1
n_desc: 0
n_value: 3952
- n_strx: 8
n_type: 0x1
n_sect: 0
n_desc: 512
n_value: 0
- n_strx: 16
n_type: 0x1
n_sect: 0
n_desc: 256
n_value: 0
StringTable:
- ' '
- _sayD
- _printf
- _sayA
- _keepSayA
IndirectSymbols: [ 0x2, 0x3, 0x2, 0x3 ]
FunctionStarts: [ 0xF60, 0xF70 ]
ChainedFixups: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x48,
0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x2, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x10, 0x6, 0x0,
0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, 0x2, 0x0,
0x0, 0x1, 0x12, 0x0, 0x0, 0x0, 0x5F, 0x70, 0x72,
0x69, 0x6E, 0x74, 0x66, 0x0, 0x5F, 0x73, 0x61,
0x79, 0x41, 0x0, 0x0 ]
- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x100000C
cpusubtype: 0x0
filetype: 0x6
ncmds: 17
sizeofcmds: 1056
flags: 0x100085
reserved: 0x0
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 392
segname: __TEXT
vmaddr: 0
vmsize: 16384
fileoff: 0
filesize: 16384
maxprot: 5
initprot: 5
nsects: 4
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x3F50
size: 48
offset: 0x3F50
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000400
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: FD7BBFA9FD0300910D000094FD7BC1A8C0035FD6FD7BBFA9FD0300910000009000603E9103000094FD7BC1A8C0035FD6
- sectname: __stubs
segname: __TEXT
addr: 0x3F80
size: 24
offset: 0x3F80
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000408
reserved1: 0x0
reserved2: 0xC
reserved3: 0x0
content: 100000B0100240F900021FD6100000B0100640F900021FD6
- sectname: __cstring
segname: __TEXT
addr: 0x3F98
size: 15
offset: 0x3F98
align: 0
reloff: 0x0
nreloc: 0
flags: 0x2
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 48656C6C6F2066726F6D2044210A00
- sectname: __unwind_info
segname: __TEXT
addr: 0x3FA8
size: 88
offset: 0x3FA8
align: 2
reloff: 0x0
nreloc: 0
flags: 0x0
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 010000001C000000000000001C000000000000001C00000002000000503F00004000000040000000803F00000000000040000000000000000000000000000000030000000C00010010000100000000000000000400000000
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DATA_CONST
vmaddr: 16384
vmsize: 16384
fileoff: 16384
filesize: 16384
maxprot: 3
initprot: 3
nsects: 1
flags: 16
Sections:
- sectname: __got
segname: __DATA_CONST
addr: 0x4000
size: 16
offset: 0x4000
align: 3
reloff: 0x0
nreloc: 0
flags: 0x6
reserved1: 0x2
reserved2: 0x0
reserved3: 0x0
content: '00000000000010800100000000000080'
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __LINKEDIT
vmaddr: 32768
vmsize: 16384
fileoff: 32768
filesize: 656
maxprot: 1
initprot: 1
nsects: 0
flags: 0
- cmd: LC_ID_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 1
current_version: 0
compatibility_version: 0
Content: '@rpath/libD.dylib'
ZeroPadBytes: 7
- cmd: LC_DYLD_CHAINED_FIXUPS
cmdsize: 16
dataoff: 32768
datasize: 96
- cmd: LC_DYLD_EXPORTS_TRIE
cmdsize: 16
dataoff: 32864
datasize: 24
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 32896
nsyms: 4
stroff: 32976
strsize: 32
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 1
iextdefsym: 1
nextdefsym: 1
iundefsym: 2
nundefsym: 2
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 32960
nindirectsyms: 4
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
- cmd: LC_UUID
cmdsize: 24
uuid: 5898A6CE-0F78-3CA2-8F7D-B1AAAF26C49F
- cmd: LC_BUILD_VERSION
cmdsize: 32
platform: 1
minos: 983040
sdk: 983552
ntools: 1
Tools:
- tool: 3
version: 73074435
- cmd: LC_SOURCE_VERSION
cmdsize: 16
version: 0
- cmd: LC_LOAD_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 2
current_version: 0
compatibility_version: 0
Content: '@rpath/libA.dylib'
ZeroPadBytes: 7
- cmd: LC_LOAD_DYLIB
cmdsize: 56
dylib:
name: 24
timestamp: 2
current_version: 88539136
compatibility_version: 65536
Content: '/usr/lib/libSystem.B.dylib'
ZeroPadBytes: 6
- cmd: LC_RPATH
cmdsize: 32
path: 12
Content: '@loader_path/../A'
ZeroPadBytes: 3
- cmd: LC_FUNCTION_STARTS
cmdsize: 16
dataoff: 32888
datasize: 8
- cmd: LC_DATA_IN_CODE
cmdsize: 16
dataoff: 32896
datasize: 0
- cmd: LC_CODE_SIGNATURE
cmdsize: 16
dataoff: 33008
datasize: 416
LinkEditData:
ExportTrie:
TerminalSize: 0
NodeOffset: 0
Name: ''
Flags: 0x0
Address: 0x0
Other: 0x0
ImportName: ''
Children:
- TerminalSize: 3
NodeOffset: 13
Name: _sayD
Flags: 0x0
Address: 0x3F64
Other: 0x0
ImportName: ''
NameList:
- n_strx: 22
n_type: 0xE
n_sect: 1
n_desc: 0
n_value: 16208
- n_strx: 2
n_type: 0xF
n_sect: 1
n_desc: 0
n_value: 16228
- n_strx: 8
n_type: 0x1
n_sect: 0
n_desc: 512
n_value: 0
- n_strx: 16
n_type: 0x1
n_sect: 0
n_desc: 256
n_value: 0
StringTable:
- ' '
- _sayD
- _printf
- _sayA
- _keepSayA
IndirectSymbols: [ 0x2, 0x3, 0x2, 0x3 ]
FunctionStarts: [ 0x3F50, 0x3F64 ]
ChainedFixups: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x48,
0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x2, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x40, 0x6, 0x0,
0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, 0x2, 0x0,
0x0, 0x1, 0x12, 0x0, 0x0, 0x0, 0x5F, 0x70, 0x72,
0x69, 0x6E, 0x74, 0x66, 0x0, 0x5F, 0x73, 0x61,
0x79, 0x41, 0x0, 0x0 ]
- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x100000C
cpusubtype: 0x80000002
filetype: 0x6
ncmds: 17
sizeofcmds: 1056
flags: 0x100085
reserved: 0x0
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 392
segname: __TEXT
vmaddr: 0
vmsize: 16384
fileoff: 0
filesize: 16384
maxprot: 5
initprot: 5
nsects: 4
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x3F40
size: 56
offset: 0x3F40
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000400
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 7F2303D5FD7BBFA9FD0300910F000094FD7BC1A8FF0F5FD67F2303D5FD7BBFA9FD0300910000009000603E9103000094FD7BC1A8FF0F5FD6
- sectname: __auth_stubs
segname: __TEXT
addr: 0x3F78
size: 32
offset: 0x3F78
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000408
reserved1: 0x0
reserved2: 0x10
reserved3: 0x0
content: 110000B031020091300240F9110A1FD7110000B031220091300240F9110A1FD7
- sectname: __cstring
segname: __TEXT
addr: 0x3F98
size: 15
offset: 0x3F98
align: 0
reloff: 0x0
nreloc: 0
flags: 0x2
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 48656C6C6F2066726F6D2044210A00
- sectname: __unwind_info
segname: __TEXT
addr: 0x3FA8
size: 88
offset: 0x3FA8
align: 2
reloff: 0x0
nreloc: 0
flags: 0x0
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 010000001C000000000000001C000000000000001C00000002000000403F00004000000040000000783F00000000000040000000000000000000000000000000030000000C00010010000100000000000000000400000000
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DATA_CONST
vmaddr: 16384
vmsize: 16384
fileoff: 16384
filesize: 16384
maxprot: 3
initprot: 3
nsects: 1
flags: 16
Sections:
- sectname: __auth_got
segname: __DATA_CONST
addr: 0x4000
size: 16
offset: 0x4000
align: 3
reloff: 0x0
nreloc: 0
flags: 0x6
reserved1: 0x2
reserved2: 0x0
reserved3: 0x0
content: 00000000000009C001000000000001C0
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __LINKEDIT
vmaddr: 32768
vmsize: 16384
fileoff: 32768
filesize: 656
maxprot: 1
initprot: 1
nsects: 0
flags: 0
- cmd: LC_ID_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 1
current_version: 0
compatibility_version: 0
Content: '@rpath/libD.dylib'
ZeroPadBytes: 7
- cmd: LC_DYLD_CHAINED_FIXUPS
cmdsize: 16
dataoff: 32768
datasize: 96
- cmd: LC_DYLD_EXPORTS_TRIE
cmdsize: 16
dataoff: 32864
datasize: 24
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 32896
nsyms: 4
stroff: 32976
strsize: 32
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 1
iextdefsym: 1
nextdefsym: 1
iundefsym: 2
nundefsym: 2
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 32960
nindirectsyms: 4
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
- cmd: LC_UUID
cmdsize: 24
uuid: 81A288C4-6F51-3913-9330-EDE155D1DD35
- cmd: LC_BUILD_VERSION
cmdsize: 32
platform: 1
minos: 983040
sdk: 983552
ntools: 1
Tools:
- tool: 3
version: 73074435
- cmd: LC_SOURCE_VERSION
cmdsize: 16
version: 0
- cmd: LC_LOAD_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 2
current_version: 0
compatibility_version: 0
Content: '@rpath/libA.dylib'
ZeroPadBytes: 7
- cmd: LC_LOAD_DYLIB
cmdsize: 56
dylib:
name: 24
timestamp: 2
current_version: 88539136
compatibility_version: 65536
Content: '/usr/lib/libSystem.B.dylib'
ZeroPadBytes: 6
- cmd: LC_RPATH
cmdsize: 32
path: 12
Content: '@loader_path/../A'
ZeroPadBytes: 3
- cmd: LC_FUNCTION_STARTS
cmdsize: 16
dataoff: 32888
datasize: 8
- cmd: LC_DATA_IN_CODE
cmdsize: 16
dataoff: 32896
datasize: 0
- cmd: LC_CODE_SIGNATURE
cmdsize: 16
dataoff: 33008
datasize: 416
LinkEditData:
ExportTrie:
TerminalSize: 0
NodeOffset: 0
Name: ''
Flags: 0x0
Address: 0x0
Other: 0x0
ImportName: ''
Children:
- TerminalSize: 3
NodeOffset: 13
Name: _sayD
Flags: 0x0
Address: 0x3F58
Other: 0x0
ImportName: ''
NameList:
- n_strx: 22
n_type: 0xE
n_sect: 1
n_desc: 0
n_value: 16192
- n_strx: 2
n_type: 0xF
n_sect: 1
n_desc: 0
n_value: 16216
- n_strx: 8
n_type: 0x1
n_sect: 0
n_desc: 512
n_value: 0
- n_strx: 16
n_type: 0x1
n_sect: 0
n_desc: 256
n_value: 0
StringTable:
- ' '
- _sayD
- _printf
- _sayA
- _keepSayA
IndirectSymbols: [ 0x2, 0x3, 0x2, 0x3 ]
FunctionStarts: [ 0x3F40, 0x3F58 ]
ChainedFixups: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x48,
0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x2, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x40, 0xC, 0x0,
0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, 0x2, 0x0,
0x0, 0x1, 0x12, 0x0, 0x0, 0x0, 0x5F, 0x70, 0x72,
0x69, 0x6E, 0x74, 0x66, 0x0, 0x5F, 0x73, 0x61,
0x79, 0x41, 0x0, 0x0 ]
...

View File

@ -1,460 +0,0 @@
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R ]
FirstSec: .note.gnu.property
LastSec: .rela.plt
Align: 0x1000
Offset: 0x0
- Type: PT_LOAD
Flags: [ PF_X, PF_R ]
FirstSec: .init
LastSec: .fini
VAddr: 0x1000
Align: 0x1000
Offset: 0x1000
- Type: PT_LOAD
Flags: [ PF_R ]
FirstSec: .rodata
LastSec: .eh_frame
VAddr: 0x2000
Align: 0x1000
Offset: 0x2000
- Type: PT_LOAD
Flags: [ PF_W, PF_R ]
FirstSec: .init_array
LastSec: .bss
VAddr: 0x3E10
Align: 0x1000
Offset: 0x2E10
- Type: PT_DYNAMIC
Flags: [ PF_W, PF_R ]
FirstSec: .dynamic
LastSec: .dynamic
VAddr: 0x3E20
Align: 0x8
Offset: 0x2E20
- Type: PT_NOTE
Flags: [ PF_R ]
FirstSec: .note.gnu.property
LastSec: .note.gnu.property
VAddr: 0x2A8
Align: 0x8
Offset: 0x2A8
- Type: PT_NOTE
Flags: [ PF_R ]
FirstSec: .note.gnu.build-id
LastSec: .note.gnu.build-id
VAddr: 0x2C8
Align: 0x4
Offset: 0x2C8
- Type: PT_GNU_PROPERTY
Flags: [ PF_R ]
FirstSec: .note.gnu.property
LastSec: .note.gnu.property
VAddr: 0x2A8
Align: 0x8
Offset: 0x2A8
- Type: PT_GNU_EH_FRAME
Flags: [ PF_R ]
FirstSec: .eh_frame_hdr
LastSec: .eh_frame_hdr
VAddr: 0x2010
Align: 0x4
Offset: 0x2010
- Type: PT_GNU_STACK
Flags: [ PF_W, PF_R ]
Align: 0x10
Offset: 0x0
- Type: PT_GNU_RELRO
Flags: [ PF_R ]
FirstSec: .init_array
LastSec: .got
VAddr: 0x3E10
Offset: 0x2E10
Sections:
- Name: .note.gnu.property
Type: SHT_NOTE
Flags: [ SHF_ALLOC ]
Address: 0x2A8
AddressAlign: 0x8
Notes:
- Name: GNU
Desc: 020000C0040000000300000000000000
Type: NT_GNU_PROPERTY_TYPE_0
- Name: .note.gnu.build-id
Type: SHT_NOTE
Flags: [ SHF_ALLOC ]
Address: 0x2C8
AddressAlign: 0x4
Notes:
- Name: GNU
Desc: 640A4A3AC0DF6BA3DAC3B51CCD727245117E0B30
Type: NT_PRPSINFO
- Name: .gnu.hash
Type: SHT_GNU_HASH
Flags: [ SHF_ALLOC ]
Address: 0x2F0
Link: .dynsym
AddressAlign: 0x8
Header:
SymNdx: 0x6
Shift2: 0x6
BloomFilter: [ 0x500000000000 ]
HashBuckets: [ 0x6, 0x0 ]
HashValues: [ 0x7C9DCBAD ]
- Name: .dynsym
Type: SHT_DYNSYM
Flags: [ SHF_ALLOC ]
Address: 0x318
Link: .dynstr
AddressAlign: 0x8
- Name: .dynstr
Type: SHT_STRTAB
Flags: [ SHF_ALLOC ]
Address: 0x3C0
AddressAlign: 0x1
- Name: .gnu.version
Type: SHT_GNU_versym
Flags: [ SHF_ALLOC ]
Address: 0x436
Link: .dynsym
AddressAlign: 0x2
Entries: [ 0, 1, 2, 1, 1, 2, 1 ]
- Name: .gnu.version_r
Type: SHT_GNU_verneed
Flags: [ SHF_ALLOC ]
Address: 0x448
Link: .dynstr
AddressAlign: 0x8
Dependencies:
- Version: 1
File: libc.so.6
Entries:
- Name: GLIBC_2.2.5
Hash: 157882997
Flags: 0
Other: 2
- Name: .rela.dyn
Type: SHT_RELA
Flags: [ SHF_ALLOC ]
Address: 0x468
Link: .dynsym
AddressAlign: 0x8
Relocations:
- Offset: 0x3E10
Type: R_X86_64_RELATIVE
Addend: 4368
- Offset: 0x3E18
Type: R_X86_64_RELATIVE
Addend: 4304
- Offset: 0x4020
Type: R_X86_64_RELATIVE
Addend: 16416
- Offset: 0x3FE0
Symbol: _ITM_deregisterTMCloneTable
Type: R_X86_64_GLOB_DAT
- Offset: 0x3FE8
Symbol: __gmon_start__
Type: R_X86_64_GLOB_DAT
- Offset: 0x3FF0
Symbol: _ITM_registerTMCloneTable
Type: R_X86_64_GLOB_DAT
- Offset: 0x3FF8
Symbol: __cxa_finalize
Type: R_X86_64_GLOB_DAT
- Name: .rela.plt
Type: SHT_RELA
Flags: [ SHF_ALLOC, SHF_INFO_LINK ]
Address: 0x510
Link: .dynsym
AddressAlign: 0x8
Info: .got.plt
Relocations:
- Offset: 0x4018
Symbol: puts
Type: R_X86_64_JUMP_SLOT
- Name: .init
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1000
AddressAlign: 0x4
Offset: 0x1000
Content: F30F1EFA4883EC08488B05D92F00004885C07402FFD04883C408C3
- Name: .plt
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1020
AddressAlign: 0x10
EntSize: 0x10
Content: FF35E22F0000F2FF25E32F00000F1F00F30F1EFA6800000000F2E9E1FFFFFF90
- Name: .plt.got
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1040
AddressAlign: 0x10
EntSize: 0x10
Content: F30F1EFAF2FF25AD2F00000F1F440000
- Name: .plt.sec
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1050
AddressAlign: 0x10
EntSize: 0x10
Content: F30F1EFAF2FF25BD2F00000F1F440000
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1060
AddressAlign: 0x10
Content: 488D3DC12F0000488D05BA2F00004839F87415488B05662F00004885C07409FFE00F1F8000000000C30F1F8000000000488D3D912F0000488D358A2F00004829FE4889F048C1EE3F48C1F8034801C648D1FE7414488B05352F00004885C07408FFE0660F1F440000C30F1F8000000000F30F1EFA803D4D2F000000752B5548833D122F0000004889E5740C488B3D2E2F0000E849FFFFFFE864FFFFFFC605252F0000015DC30F1F00C30F1F8000000000F30F1EFAE977FFFFFFF30F1EFA554889E5488D05D80E00004889C7E820FFFFFF905DC3
- Name: .fini
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1134
AddressAlign: 0x4
Content: F30F1EFA4883EC084883C408C3
- Name: .rodata
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x2000
AddressAlign: 0x1
Offset: 0x2000
Content: 48656C6C6F2066726F6D205A00
- Name: .eh_frame_hdr
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x2010
AddressAlign: 0x4
Content: 011B033B2C0000000400000010F0FFFF4800000030F0FFFF7000000040F0FFFF8800000009F1FFFFA0000000
- Name: .eh_frame
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Address: 0x2040
AddressAlign: 0x8
Content: 1400000000000000017A5200017810011B0C070890010000240000001C000000C0EFFFFF20000000000E10460E184A0F0B770880003F1A3A2A332422000000001400000044000000B8EFFFFF100000000000000000000000140000005C000000B0EFFFFF1000000000000000000000001C0000007400000061F0FFFF1A00000000450E108602430D06510C070800000000000000
- Name: .init_array
Type: SHT_INIT_ARRAY
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3E10
AddressAlign: 0x8
EntSize: 0x8
Offset: 0x2E10
Content: '1011000000000000'
- Name: .fini_array
Type: SHT_FINI_ARRAY
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3E18
AddressAlign: 0x8
EntSize: 0x8
Content: D010000000000000
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3E20
Link: .dynstr
AddressAlign: 0x8
Entries:
- Tag: DT_NEEDED
Value: 0x5F
- Tag: DT_INIT
Value: 0x1000
- Tag: DT_FINI
Value: 0x1134
- Tag: DT_INIT_ARRAY
Value: 0x3E10
- Tag: DT_INIT_ARRAYSZ
Value: 0x8
- Tag: DT_FINI_ARRAY
Value: 0x3E18
- Tag: DT_FINI_ARRAYSZ
Value: 0x8
- Tag: DT_GNU_HASH
Value: 0x2F0
- Tag: DT_STRTAB
Value: 0x3C0
- Tag: DT_SYMTAB
Value: 0x318
- Tag: DT_STRSZ
Value: 0x75
- Tag: DT_SYMENT
Value: 0x18
- Tag: DT_PLTGOT
Value: 0x4000
- Tag: DT_PLTRELSZ
Value: 0x18
- Tag: DT_PLTREL
Value: 0x7
- Tag: DT_JMPREL
Value: 0x510
- Tag: DT_RELA
Value: 0x468
- Tag: DT_RELASZ
Value: 0xA8
- Tag: DT_RELAENT
Value: 0x18
- Tag: DT_VERNEED
Value: 0x448
- Tag: DT_VERNEEDNUM
Value: 0x1
- Tag: DT_VERSYM
Value: 0x436
- Tag: DT_RELACOUNT
Value: 0x3
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Tag: DT_NULL
Value: 0x0
- Name: .got
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x3FE0
AddressAlign: 0x8
EntSize: 0x8
Content: '0000000000000000000000000000000000000000000000000000000000000000'
- Name: .got.plt
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x4000
AddressAlign: 0x8
EntSize: 0x8
Content: '203E000000000000000000000000000000000000000000003010000000000000'
- Name: .data
Type: SHT_PROGBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x4020
AddressAlign: 0x8
Content: '2040000000000000'
- Name: .bss
Type: SHT_NOBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
Address: 0x4028
AddressAlign: 0x1
Size: 0x8
- Name: .comment
Type: SHT_PROGBITS
Flags: [ SHF_MERGE, SHF_STRINGS ]
AddressAlign: 0x1
EntSize: 0x1
Content: 4743433A20285562756E74752031312E342E302D317562756E7475317E32322E30342E32292031312E342E3000
Symbols:
- Name: crtstuff.c
Type: STT_FILE
Index: SHN_ABS
- Name: deregister_tm_clones
Type: STT_FUNC
Section: .text
Value: 0x1060
- Name: register_tm_clones
Type: STT_FUNC
Section: .text
Value: 0x1090
- Name: __do_global_dtors_aux
Type: STT_FUNC
Section: .text
Value: 0x10D0
- Name: completed.0
Type: STT_OBJECT
Section: .bss
Value: 0x4028
Size: 0x1
- Name: __do_global_dtors_aux_fini_array_entry
Type: STT_OBJECT
Section: .fini_array
Value: 0x3E18
- Name: frame_dummy
Type: STT_FUNC
Section: .text
Value: 0x1110
- Name: __frame_dummy_init_array_entry
Type: STT_OBJECT
Section: .init_array
Value: 0x3E10
- Name: libZ.c
Type: STT_FILE
Index: SHN_ABS
- Name: 'crtstuff.c (1)'
Type: STT_FILE
Index: SHN_ABS
- Name: __FRAME_END__
Type: STT_OBJECT
Section: .eh_frame
Value: 0x20D0
- Type: STT_FILE
Index: SHN_ABS
- Name: _fini
Type: STT_FUNC
Section: .fini
Value: 0x1134
- Name: __dso_handle
Type: STT_OBJECT
Section: .data
Value: 0x4020
- Name: _DYNAMIC
Type: STT_OBJECT
Section: .dynamic
Value: 0x3E20
- Name: __GNU_EH_FRAME_HDR
Section: .eh_frame_hdr
Value: 0x2010
- Name: __TMC_END__
Type: STT_OBJECT
Section: .data
Value: 0x4028
- Name: _GLOBAL_OFFSET_TABLE_
Type: STT_OBJECT
Section: .got.plt
Value: 0x4000
- Name: _init
Type: STT_FUNC
Section: .init
Value: 0x1000
- Name: _ITM_deregisterTMCloneTable
Binding: STB_WEAK
- Name: 'puts@GLIBC_2.2.5'
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: __gmon_start__
Binding: STB_WEAK
- Name: sayZ
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
Value: 0x1119
Size: 0x1A
- Name: _ITM_registerTMCloneTable
Binding: STB_WEAK
- Name: '__cxa_finalize@GLIBC_2.2.5'
Type: STT_FUNC
Binding: STB_WEAK
DynamicSymbols:
- Name: _ITM_deregisterTMCloneTable
Binding: STB_WEAK
- Name: puts
Type: STT_FUNC
Binding: STB_GLOBAL
- Name: __gmon_start__
Binding: STB_WEAK
- Name: _ITM_registerTMCloneTable
Binding: STB_WEAK
- Name: __cxa_finalize
Type: STT_FUNC
Binding: STB_WEAK
- Name: sayZ
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
Value: 0x1119
Size: 0x1A
...

View File

@ -1,723 +0,0 @@
--- !fat-mach-o
FatHeader:
magic: 0xCAFEBABE
nfat_arch: 3
FatArchs:
- cputype: 0x1000007
cpusubtype: 0x3
offset: 0x1000
size: 8376
align: 12
- cputype: 0x100000C
cpusubtype: 0x0
offset: 0x4000
size: 33376
align: 14
- cputype: 0x100000C
cpusubtype: 0x80000002
offset: 0x10000
size: 33376
align: 14
Slices:
- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x1000007
cpusubtype: 0x3
filetype: 0x6
ncmds: 14
sizeofcmds: 960
flags: 0x100085
reserved: 0x0
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 392
segname: __TEXT
vmaddr: 0
vmsize: 4096
fileoff: 0
filesize: 4096
maxprot: 5
initprot: 5
nsects: 4
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0xF80
size: 20
offset: 0xF80
align: 4
reloff: 0x0
nreloc: 0
flags: 0x80000400
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 554889E5488D3D0F000000B000E8020000005DC3
- sectname: __stubs
segname: __TEXT
addr: 0xF94
size: 6
offset: 0xF94
align: 1
reloff: 0x0
nreloc: 0
flags: 0x80000408
reserved1: 0x0
reserved2: 0x6
reserved3: 0x0
content: FF2566000000
- sectname: __cstring
segname: __TEXT
addr: 0xF9A
size: 14
offset: 0xF9A
align: 0
reloff: 0x0
nreloc: 0
flags: 0x2
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 48656C6C6F2066726F6D205A0A00
- sectname: __unwind_info
segname: __TEXT
addr: 0xFA8
size: 88
offset: 0xFA8
align: 2
reloff: 0x0
nreloc: 0
flags: 0x0
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 010000001C000000000000001C000000000000001C00000002000000800F00004000000040000000940F00000000000040000000000000000000000000000000030000000C00010010000100000000000000000100000000
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DATA_CONST
vmaddr: 4096
vmsize: 4096
fileoff: 4096
filesize: 4096
maxprot: 3
initprot: 3
nsects: 1
flags: 16
Sections:
- sectname: __got
segname: __DATA_CONST
addr: 0x1000
size: 8
offset: 0x1000
align: 3
reloff: 0x0
nreloc: 0
flags: 0x6
reserved1: 0x1
reserved2: 0x0
reserved3: 0x0
content: '0000000000000080'
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __LINKEDIT
vmaddr: 8192
vmsize: 4096
fileoff: 8192
filesize: 184
maxprot: 1
initprot: 1
nsects: 0
flags: 0
- cmd: LC_ID_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 1
current_version: 0
compatibility_version: 0
Content: '@rpath/libZ.dylib'
ZeroPadBytes: 7
- cmd: LC_DYLD_CHAINED_FIXUPS
cmdsize: 16
dataoff: 8192
datasize: 96
- cmd: LC_DYLD_EXPORTS_TRIE
cmdsize: 16
dataoff: 8288
datasize: 24
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 8320
nsyms: 2
stroff: 8360
strsize: 16
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 0
iextdefsym: 0
nextdefsym: 1
iundefsym: 1
nundefsym: 1
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 8352
nindirectsyms: 2
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
- cmd: LC_UUID
cmdsize: 24
uuid: 399E203C-FF9A-3B80-872C-85F3A759A78B
- cmd: LC_BUILD_VERSION
cmdsize: 32
platform: 1
minos: 983040
sdk: 983552
ntools: 1
Tools:
- tool: 3
version: 73074435
- cmd: LC_SOURCE_VERSION
cmdsize: 16
version: 0
- cmd: LC_LOAD_DYLIB
cmdsize: 56
dylib:
name: 24
timestamp: 2
current_version: 88539136
compatibility_version: 65536
Content: '/usr/lib/libSystem.B.dylib'
ZeroPadBytes: 6
- cmd: LC_FUNCTION_STARTS
cmdsize: 16
dataoff: 8312
datasize: 8
- cmd: LC_DATA_IN_CODE
cmdsize: 16
dataoff: 8320
datasize: 0
LinkEditData:
ExportTrie:
TerminalSize: 0
NodeOffset: 0
Name: ''
Flags: 0x0
Address: 0x0
Other: 0x0
ImportName: ''
Children:
- TerminalSize: 3
NodeOffset: 13
Name: _sayZ
Flags: 0x0
Address: 0xF80
Other: 0x0
ImportName: ''
NameList:
- n_strx: 2
n_type: 0xF
n_sect: 1
n_desc: 0
n_value: 3968
- n_strx: 8
n_type: 0x1
n_sect: 0
n_desc: 256
n_value: 0
StringTable:
- ' '
- _sayZ
- _printf
IndirectSymbols: [ 0x1, 0x1 ]
FunctionStarts: [ 0xF80 ]
ChainedFixups: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x48,
0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x1, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x10, 0x6, 0x0,
0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5F, 0x70, 0x72,
0x69, 0x6E, 0x74, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0 ]
- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x100000C
cpusubtype: 0x0
filetype: 0x6
ncmds: 15
sizeofcmds: 976
flags: 0x100085
reserved: 0x0
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 392
segname: __TEXT
vmaddr: 0
vmsize: 16384
fileoff: 0
filesize: 16384
maxprot: 5
initprot: 5
nsects: 4
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x3F70
size: 28
offset: 0x3F70
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000400
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: FD7BBFA9FD0300910000009000603E9103000094FD7BC1A8C0035FD6
- sectname: __stubs
segname: __TEXT
addr: 0x3F8C
size: 12
offset: 0x3F8C
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000408
reserved1: 0x0
reserved2: 0xC
reserved3: 0x0
content: 100000B0100240F900021FD6
- sectname: __cstring
segname: __TEXT
addr: 0x3F98
size: 14
offset: 0x3F98
align: 0
reloff: 0x0
nreloc: 0
flags: 0x2
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 48656C6C6F2066726F6D205A0A00
- sectname: __unwind_info
segname: __TEXT
addr: 0x3FA8
size: 88
offset: 0x3FA8
align: 2
reloff: 0x0
nreloc: 0
flags: 0x0
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 010000001C000000000000001C000000000000001C00000002000000703F000040000000400000008C3F00000000000040000000000000000000000000000000030000000C00010010000100000000000000000400000000
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DATA_CONST
vmaddr: 16384
vmsize: 16384
fileoff: 16384
filesize: 16384
maxprot: 3
initprot: 3
nsects: 1
flags: 16
Sections:
- sectname: __got
segname: __DATA_CONST
addr: 0x4000
size: 8
offset: 0x4000
align: 3
reloff: 0x0
nreloc: 0
flags: 0x6
reserved1: 0x1
reserved2: 0x0
reserved3: 0x0
content: '0000000000000080'
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __LINKEDIT
vmaddr: 32768
vmsize: 16384
fileoff: 32768
filesize: 608
maxprot: 1
initprot: 1
nsects: 0
flags: 0
- cmd: LC_ID_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 1
current_version: 0
compatibility_version: 0
Content: '@rpath/libZ.dylib'
ZeroPadBytes: 7
- cmd: LC_DYLD_CHAINED_FIXUPS
cmdsize: 16
dataoff: 32768
datasize: 96
- cmd: LC_DYLD_EXPORTS_TRIE
cmdsize: 16
dataoff: 32864
datasize: 24
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 32896
nsyms: 2
stroff: 32936
strsize: 16
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 0
iextdefsym: 0
nextdefsym: 1
iundefsym: 1
nundefsym: 1
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 32928
nindirectsyms: 2
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
- cmd: LC_UUID
cmdsize: 24
uuid: 6E8E78AF-EDB2-3830-BE1E-013390302CC5
- cmd: LC_BUILD_VERSION
cmdsize: 32
platform: 1
minos: 983040
sdk: 983552
ntools: 1
Tools:
- tool: 3
version: 73074435
- cmd: LC_SOURCE_VERSION
cmdsize: 16
version: 0
- cmd: LC_LOAD_DYLIB
cmdsize: 56
dylib:
name: 24
timestamp: 2
current_version: 88539136
compatibility_version: 65536
Content: '/usr/lib/libSystem.B.dylib'
ZeroPadBytes: 6
- cmd: LC_FUNCTION_STARTS
cmdsize: 16
dataoff: 32888
datasize: 8
- cmd: LC_DATA_IN_CODE
cmdsize: 16
dataoff: 32896
datasize: 0
- cmd: LC_CODE_SIGNATURE
cmdsize: 16
dataoff: 32960
datasize: 416
LinkEditData:
ExportTrie:
TerminalSize: 0
NodeOffset: 0
Name: ''
Flags: 0x0
Address: 0x0
Other: 0x0
ImportName: ''
Children:
- TerminalSize: 3
NodeOffset: 13
Name: _sayZ
Flags: 0x0
Address: 0x3F70
Other: 0x0
ImportName: ''
NameList:
- n_strx: 2
n_type: 0xF
n_sect: 1
n_desc: 0
n_value: 16240
- n_strx: 8
n_type: 0x1
n_sect: 0
n_desc: 256
n_value: 0
StringTable:
- ' '
- _sayZ
- _printf
IndirectSymbols: [ 0x1, 0x1 ]
FunctionStarts: [ 0x3F70 ]
ChainedFixups: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x48,
0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x1, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x40, 0x6, 0x0,
0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5F, 0x70, 0x72,
0x69, 0x6E, 0x74, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0 ]
- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x100000C
cpusubtype: 0x80000002
filetype: 0x6
ncmds: 15
sizeofcmds: 976
flags: 0x100085
reserved: 0x0
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 392
segname: __TEXT
vmaddr: 0
vmsize: 16384
fileoff: 0
filesize: 16384
maxprot: 5
initprot: 5
nsects: 4
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x3F68
size: 32
offset: 0x3F68
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000400
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 7F2303D5FD7BBFA9FD0300910000009000603E9103000094FD7BC1A8FF0F5FD6
- sectname: __auth_stubs
segname: __TEXT
addr: 0x3F88
size: 16
offset: 0x3F88
align: 2
reloff: 0x0
nreloc: 0
flags: 0x80000408
reserved1: 0x0
reserved2: 0x10
reserved3: 0x0
content: 110000B031020091300240F9110A1FD7
- sectname: __cstring
segname: __TEXT
addr: 0x3F98
size: 14
offset: 0x3F98
align: 0
reloff: 0x0
nreloc: 0
flags: 0x2
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 48656C6C6F2066726F6D205A0A00
- sectname: __unwind_info
segname: __TEXT
addr: 0x3FA8
size: 88
offset: 0x3FA8
align: 2
reloff: 0x0
nreloc: 0
flags: 0x0
reserved1: 0x0
reserved2: 0x0
reserved3: 0x0
content: 010000001C000000000000001C000000000000001C00000002000000683F00004000000040000000883F00000000000040000000000000000000000000000000030000000C00010010000100000000000000000400000000
- cmd: LC_SEGMENT_64
cmdsize: 152
segname: __DATA_CONST
vmaddr: 16384
vmsize: 16384
fileoff: 16384
filesize: 16384
maxprot: 3
initprot: 3
nsects: 1
flags: 16
Sections:
- sectname: __auth_got
segname: __DATA_CONST
addr: 0x4000
size: 8
offset: 0x4000
align: 3
reloff: 0x0
nreloc: 0
flags: 0x6
reserved1: 0x1
reserved2: 0x0
reserved3: 0x0
content: 00000000000001C0
- cmd: LC_SEGMENT_64
cmdsize: 72
segname: __LINKEDIT
vmaddr: 32768
vmsize: 16384
fileoff: 32768
filesize: 608
maxprot: 1
initprot: 1
nsects: 0
flags: 0
- cmd: LC_ID_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 1
current_version: 0
compatibility_version: 0
Content: '@rpath/libZ.dylib'
ZeroPadBytes: 7
- cmd: LC_DYLD_CHAINED_FIXUPS
cmdsize: 16
dataoff: 32768
datasize: 96
- cmd: LC_DYLD_EXPORTS_TRIE
cmdsize: 16
dataoff: 32864
datasize: 24
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 32896
nsyms: 2
stroff: 32936
strsize: 16
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 0
iextdefsym: 0
nextdefsym: 1
iundefsym: 1
nundefsym: 1
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 32928
nindirectsyms: 2
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
- cmd: LC_UUID
cmdsize: 24
uuid: E74F368D-238F-31FA-BF40-FA2964FED986
- cmd: LC_BUILD_VERSION
cmdsize: 32
platform: 1
minos: 983040
sdk: 983552
ntools: 1
Tools:
- tool: 3
version: 73074435
- cmd: LC_SOURCE_VERSION
cmdsize: 16
version: 0
- cmd: LC_LOAD_DYLIB
cmdsize: 56
dylib:
name: 24
timestamp: 2
current_version: 88539136
compatibility_version: 65536
Content: '/usr/lib/libSystem.B.dylib'
ZeroPadBytes: 6
- cmd: LC_FUNCTION_STARTS
cmdsize: 16
dataoff: 32888
datasize: 8
- cmd: LC_DATA_IN_CODE
cmdsize: 16
dataoff: 32896
datasize: 0
- cmd: LC_CODE_SIGNATURE
cmdsize: 16
dataoff: 32960
datasize: 416
LinkEditData:
ExportTrie:
TerminalSize: 0
NodeOffset: 0
Name: ''
Flags: 0x0
Address: 0x0
Other: 0x0
ImportName: ''
Children:
- TerminalSize: 3
NodeOffset: 13
Name: _sayZ
Flags: 0x0
Address: 0x3F68
Other: 0x0
ImportName: ''
NameList:
- n_strx: 2
n_type: 0xF
n_sect: 1
n_desc: 0
n_value: 16232
- n_strx: 8
n_type: 0x1
n_sect: 0
n_desc: 256
n_value: 0
StringTable:
- ' '
- _sayZ
- _printf
IndirectSymbols: [ 0x1, 0x1 ]
FunctionStarts: [ 0x3F68 ]
ChainedFixups: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x48,
0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x1, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x40, 0xC, 0x0,
0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5F, 0x70, 0x72,
0x69, 0x6E, 0x74, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0 ]
...

View File

@ -1,886 +0,0 @@
//===- LibraryResolverTest.cpp - Unit tests for LibraryResolver -===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "llvm/ExecutionEngine/Orc/TargetProcess/LibraryResolver.h"
#include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"
#include "llvm/ExecutionEngine/Orc/TargetProcess/LibraryScanner.h"
#include "llvm/ObjectYAML/MachOYAML.h"
#include "llvm/ObjectYAML/yaml2obj.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/YAMLParser.h"
#include "llvm/Support/YAMLTraits.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Testing/Support/SupportHelpers.h"
#include "gtest/gtest.h"
#include <algorithm>
#include <optional>
#include <string>
#include <vector>
using namespace llvm;
using namespace llvm::orc;
#if defined(__APPLE__) || defined(__linux__)
// TODO: Add COFF (Windows) support for these tests.
// this facility also works correctly on Windows (COFF),
// so we should eventually enable and run these tests for that platform as well.
namespace {
#if defined(__APPLE__)
constexpr const char *ext = ".dylib";
#elif defined(_WIN32)
constexpr const char *ext = ".dll";
#else
constexpr const char *ext = ".so";
#endif
bool EnvReady = false;
Triple getTargetTriple() {
auto JTMB = JITTargetMachineBuilder::detectHost();
if (!JTMB) {
consumeError(JTMB.takeError());
return Triple();
}
return JTMB->getTargetTriple();
}
static bool CheckHostSupport() {
auto Triple = getTargetTriple();
// TODO: Extend support to COFF (Windows) once test setup and YAML conversion
// are verified.
if (!Triple.isOSBinFormatMachO() &&
!(Triple.isOSBinFormatELF() && Triple.getArch() == Triple::x86_64))
return false;
return true;
}
std::string getYamlFilePlatformExt() {
auto Triple = getTargetTriple();
if (Triple.isOSBinFormatMachO())
return "_macho";
else if (Triple.isOSBinFormatELF())
return "_linux";
return "";
}
unsigned getYamlDocNum() {
// auto Triple = getTargetTriple();
// if (Triple.isOSBinFormatELF())
// return 1;
return 1;
}
class LibraryTestEnvironment : public ::testing::Environment {
std::vector<std::string> CreatedDylibsDir;
std::vector<std::string> CreatedDylibs;
SmallVector<char, 128> DirPath;
public:
void SetUp() override {
if (!CheckHostSupport()) {
EnvReady = false;
return;
}
StringRef ThisFile = __FILE__;
SmallVector<char, 128> InputDirPath(ThisFile.begin(), ThisFile.end());
sys::path::remove_filename(InputDirPath);
sys::path::append(InputDirPath, "Inputs");
if (!sys::fs::exists(InputDirPath))
return;
SmallString<128> UniqueDir;
sys::path::append(UniqueDir, InputDirPath);
std::error_code EC = sys::fs::createUniqueDirectory(UniqueDir, DirPath);
if (EC)
return;
// given yamlPath + DylibPath, validate + convert
auto processYamlToDylib = [&](const SmallVector<char, 128> &YamlPath,
const SmallVector<char, 128> &DylibPath,
unsigned DocNum) -> bool {
if (!sys::fs::exists(YamlPath)) {
errs() << "YAML file missing: "
<< StringRef(YamlPath.data(), YamlPath.size()) << "\n";
EnvReady = false;
return false;
}
auto BufOrErr = MemoryBuffer::getFile(YamlPath);
if (!BufOrErr) {
errs() << "Failed to read "
<< StringRef(YamlPath.data(), YamlPath.size()) << ": "
<< BufOrErr.getError().message() << "\n";
EnvReady = false;
return false;
}
yaml::Input yin(BufOrErr->get()->getBuffer());
std::error_code EC;
raw_fd_ostream outFile(StringRef(DylibPath.data(), DylibPath.size()), EC,
sys::fs::OF_None);
if (EC) {
errs() << "Failed to open "
<< StringRef(DylibPath.data(), DylibPath.size())
<< " for writing: " << EC.message() << "\n";
EnvReady = false;
return false;
}
if (!yaml::convertYAML(
yin, outFile,
[](const Twine &M) {
// Handle or ignore errors here
errs() << "Yaml Error :" << M << "\n";
},
DocNum)) {
errs() << "Failed to convert "
<< StringRef(YamlPath.data(), YamlPath.size()) << " to "
<< StringRef(DylibPath.data(), DylibPath.size()) << "\n";
EnvReady = false;
return false;
}
CreatedDylibsDir.push_back(std::string(sys::path::parent_path(
StringRef(DylibPath.data(), DylibPath.size()))));
CreatedDylibs.push_back(std::string(DylibPath.begin(), DylibPath.end()));
return true;
};
std::vector<const char *> LibDirs = {"Z", "A", "B", "C", "D"};
unsigned DocNum = getYamlDocNum();
std::string YamlPltExt = getYamlFilePlatformExt();
for (const auto &LibdirName : LibDirs) {
// YAML path
SmallVector<char, 128> YamlPath(InputDirPath.begin(), InputDirPath.end());
SmallVector<char, 128> YamlFileName;
YamlFileName.append(LibdirName, LibdirName + strlen(LibdirName));
YamlFileName.append(YamlPltExt.begin(), YamlPltExt.end());
sys::path::append(YamlPath, LibdirName, YamlFileName);
sys::path::replace_extension(YamlPath, ".yaml");
// dylib path
SmallVector<char, 128> DylibPath(DirPath.begin(), DirPath.end());
SmallVector<char, 128> DylibFileName;
StringRef prefix("lib");
DylibFileName.append(prefix.begin(), prefix.end());
DylibFileName.append(LibdirName, LibdirName + strlen(LibdirName));
sys::path::append(DylibPath, LibdirName);
if (!sys::fs::exists(DylibPath)) {
auto EC = sys::fs::create_directory(DylibPath);
if (EC)
return;
}
sys::path::append(DylibPath, DylibFileName);
sys::path::replace_extension(DylibPath, ext);
if (!processYamlToDylib(YamlPath, DylibPath, DocNum))
return;
}
EnvReady = true;
}
void TearDown() override { sys::fs::remove_directories(DirPath); }
std::string getBaseDir() const {
return std::string(DirPath.begin(), DirPath.end());
}
std::vector<std::string> getDylibPaths() const { return CreatedDylibs; }
};
static LibraryTestEnvironment *GlobalEnv =
static_cast<LibraryTestEnvironment *>(
::testing::AddGlobalTestEnvironment(new LibraryTestEnvironment()));
inline std::string libPath(const std::string &BaseDir,
const std::string &name) {
#if defined(__APPLE__)
return BaseDir + "/" + name + ".dylib";
#elif defined(_WIN32)
return BaseDir + "/" + name + ".dll";
#else
return BaseDir + "/" + name + ".so";
#endif
}
inline std::string withext(const std::string &lib) {
SmallString<128> P(lib);
sys::path::replace_extension(P, ext);
return P.str().str();
}
inline std::string platformSymbolName(const std::string &name) {
#if defined(__APPLE__)
return "_" + name; // macOS prepends underscore
#else
return name;
#endif
}
struct TestLibrary {
std::string path;
std::vector<std::string> Syms;
};
class LibraryResolverIT : public ::testing::Test {
protected:
std::string BaseDir;
std::unordered_map<std::string, TestLibrary> libs;
void SetUp() override {
if (!EnvReady)
GTEST_SKIP() << "Skipping test: environment setup failed.";
ASSERT_NE(GlobalEnv, nullptr);
BaseDir = GlobalEnv->getBaseDir();
libs["A"] = {libPath(BaseDir, "A/libA"), {platformSymbolName("sayA")}};
libs["B"] = {libPath(BaseDir, "B/libB"), {platformSymbolName("sayB")}};
libs["C"] = {libPath(BaseDir, "C/libC"), {platformSymbolName("sayC")}};
libs["D"] = {libPath(BaseDir, "D/libD"), {platformSymbolName("sayD")}};
libs["Z"] = {libPath(BaseDir, "Z/libZ"), {platformSymbolName("sayZ")}};
for (const auto &P : GlobalEnv->getDylibPaths()) {
if (!sys::fs::exists(P))
GTEST_SKIP();
}
}
const std::vector<std::string> &sym(const std::string &key) {
return libs[key].Syms;
}
const std::string &lib(const std::string &key) { return libs[key].path; }
const std::string libdir(const std::string &key) {
SmallString<512> P(libs[key].path);
sys::path::remove_filename(P);
return P.str().str();
}
const std::string libname(const std::string &key) {
return sys::path::filename(libs[key].path).str();
}
};
// Helper: allow either "sayA" or "_sayA" depending on how your SymbolEnumerator
// reports.
static bool matchesEitherUnderscore(const std::string &got,
const std::string &bare) {
return got == bare || got == ("_" + bare);
}
// Helper: normalize path ending check (we only care that it resolved to the
// right dylib)
static bool endsWith(const std::string &s, const std::string &suffix) {
if (s.size() < suffix.size())
return false;
return std::equal(suffix.rbegin(), suffix.rend(), s.rbegin());
}
// --- 1) SymbolEnumerator enumerates real exports from libC.dylib ---
TEST_F(LibraryResolverIT, EnumerateSymbolsFromARespectsDefaults) {
const std::string libC = lib("C");
SymbolEnumeratorOptions Opts = SymbolEnumeratorOptions::defaultOptions();
std::vector<std::string> seen;
auto onEach = [&](llvm::StringRef sym) -> EnumerateResult {
seen.emplace_back(sym.str());
return EnumerateResult::Continue;
};
const bool ok = SymbolEnumerator::enumerateSymbols(libC, onEach, Opts);
ASSERT_TRUE(ok) << "enumerateSymbols failed on " << libC;
// We expect to see sayA (export) and not an undefined reference to printf.
bool foundSayA = false;
for (const auto &s : seen) {
if (matchesEitherUnderscore(s, "sayA")) {
foundSayA = true;
break;
}
}
EXPECT_FALSE(foundSayA) << "Expected exported symbol sayA in libC";
}
TEST_F(LibraryResolverIT, EnumerateSymbols_ExportsOnly_DefaultFlags) {
const std::string libC = lib("C");
SymbolEnumeratorOptions Opts = SymbolEnumeratorOptions::defaultOptions();
std::vector<std::string> seen;
auto onEach = [&](llvm::StringRef sym) -> EnumerateResult {
seen.emplace_back(sym.str());
return EnumerateResult::Continue;
};
ASSERT_TRUE(SymbolEnumerator::enumerateSymbols(libC, onEach, Opts));
// sayC is exported, others are undefined → only sayC expected
EXPECT_TRUE(any_of(seen, [&](const std::string &s) {
return matchesEitherUnderscore(s, "sayC");
}));
EXPECT_FALSE(any_of(seen, [&](const std::string &s) {
return matchesEitherUnderscore(s, "sayA");
}));
EXPECT_FALSE(any_of(seen, [&](const std::string &s) {
return matchesEitherUnderscore(s, "sayB");
}));
EXPECT_FALSE(any_of(seen, [&](const std::string &s) {
return matchesEitherUnderscore(s, "sayZ");
}));
}
TEST_F(LibraryResolverIT, EnumerateSymbols_IncludesUndefineds) {
const std::string libC = lib("C");
SymbolEnumeratorOptions Opts;
Opts.FilterFlags =
SymbolEnumeratorOptions::IgnoreWeak |
SymbolEnumeratorOptions::IgnoreIndirect; // no IgnoreUndefined
std::vector<std::string> seen;
auto onEach = [&](llvm::StringRef sym) -> EnumerateResult {
seen.emplace_back(sym.str());
return EnumerateResult::Continue;
};
ASSERT_TRUE(SymbolEnumerator::enumerateSymbols(libC, onEach, Opts));
// Now we should see both sayC (export) and the undefined refs sayA, sayB,
// sayZ
EXPECT_TRUE(any_of(seen, [&](const std::string &s) {
return matchesEitherUnderscore(s, "sayC");
}));
EXPECT_TRUE(any_of(seen, [&](const std::string &s) {
return matchesEitherUnderscore(s, "sayA");
}));
EXPECT_TRUE(any_of(seen, [&](const std::string &s) {
return matchesEitherUnderscore(s, "sayB");
}));
EXPECT_TRUE(any_of(seen, [&](const std::string &s) {
return matchesEitherUnderscore(s, "sayZ");
}));
}
TEST_F(LibraryResolverIT, EnumerateSymbols_IndirectExportRespected) {
const std::string libD = lib("D");
SymbolEnumeratorOptions Opts;
Opts.FilterFlags = SymbolEnumeratorOptions::IgnoreWeak; // allow indirects
std::vector<std::string> seen;
auto onEach = [&](llvm::StringRef sym) -> EnumerateResult {
seen.emplace_back(sym.str());
return EnumerateResult::Continue;
};
ASSERT_TRUE(SymbolEnumerator::enumerateSymbols(libD, onEach, Opts));
// sayA is re-exported from A, so should appear unless IgnoreIndirect was set
EXPECT_TRUE(any_of(seen, [&](const std::string &s) {
return matchesEitherUnderscore(s, "sayA");
}));
}
// --- 2) Filters: if we remove IgnoreUndefined, we should also see undefineds
// like printf ---
TEST_F(LibraryResolverIT, EnumerateSymbolsIncludesUndefWhenNotIgnored) {
const std::string libA = lib("A");
SymbolEnumeratorOptions Opts = SymbolEnumeratorOptions::defaultOptions();
// Start from defaults but allow undefined
Opts.FilterFlags &= ~SymbolEnumeratorOptions::IgnoreUndefined;
bool SawPrintf = false;
auto onEach = [&](llvm::StringRef sym) -> EnumerateResult {
if (matchesEitherUnderscore(sym.str(), "printf") ||
matchesEitherUnderscore(sym.str(), "puts"))
SawPrintf = true;
return EnumerateResult::Continue;
};
ASSERT_TRUE(SymbolEnumerator::enumerateSymbols(libA, onEach, Opts));
EXPECT_TRUE(SawPrintf)
<< "Expected to see undefined symbol printf when not filtered";
}
// --- 3) Full resolution via LibraryResolutionDriver/LibraryResolver ---
TEST_F(LibraryResolverIT, DriverResolvesSymbolsToCorrectLibraries) {
// Create the resolver from real base paths (our fixtures dir)
auto Stup = LibraryResolver::Setup::create({BaseDir});
// Full system behavior: no mocks
auto Driver = LibraryResolutionDriver::create(Stup);
ASSERT_NE(Driver, nullptr);
// Tell the Driver about the scan path kinds (User/System) as your production
// code expects.
Driver->addScanPath(libdir("A"), PathType::User);
Driver->addScanPath(libdir("B"), PathType::User);
Driver->addScanPath(libdir("Z"), PathType::User);
// Symbols to resolve (bare names; class handles underscore differences
// internally)
std::vector<std::string> Syms = {platformSymbolName("sayA"),
platformSymbolName("sayB"),
platformSymbolName("sayZ")};
bool CallbackRan = false;
Driver->resolveSymbols(Syms, [&](SymbolQuery &Q) {
CallbackRan = true;
// sayA should resolve to A.dylib
{
auto lib = Q.getResolvedLib(platformSymbolName("sayA"));
ASSERT_TRUE(lib.has_value()) << "sayA should be resolved";
EXPECT_TRUE(endsWith(lib->str(), libname("A")))
<< "sayA resolved to: " << lib->str();
}
// sayB should resolve to B.dylib
{
auto lib = Q.getResolvedLib(platformSymbolName("sayB"));
ASSERT_TRUE(lib.has_value()) << "sayB should be resolved";
EXPECT_TRUE(endsWith(lib->str(), libname("B")))
<< "sayB resolved to: " << lib->str();
}
// sayZ should resolve to B.dylib
{
auto lib = Q.getResolvedLib(platformSymbolName("sayZ"));
ASSERT_TRUE(lib.has_value()) << "sayZ should be resolved";
EXPECT_TRUE(endsWith(lib->str(), libname("Z")))
<< "sayZ resolved to: " << lib->str();
}
EXPECT_TRUE(Q.allResolved());
});
EXPECT_TRUE(CallbackRan);
}
// --- 4) Cross-library reference visibility (C references A) ---
TEST_F(LibraryResolverIT, EnumeratorSeesInterLibraryRelationship) {
const std::string libC = lib("C");
SymbolEnumeratorOptions OnlyUndef = SymbolEnumeratorOptions::defaultOptions();
// Show only undefined (drop IgnoreUndefined) to see C's reference to sayA
OnlyUndef.FilterFlags &= ~SymbolEnumeratorOptions::IgnoreUndefined;
bool SawSayAAsUndef = false;
auto onEach = [&](llvm::StringRef sym) -> EnumerateResult {
if (matchesEitherUnderscore(sym.str(), "sayA"))
SawSayAAsUndef = true;
return EnumerateResult::Continue;
};
ASSERT_TRUE(SymbolEnumerator::enumerateSymbols(libC, onEach, OnlyUndef));
EXPECT_TRUE(SawSayAAsUndef)
<< "libC should have an undefined reference to sayA (defined in libA)";
}
// // // --- 5) Optional: stress SymbolQuery with the real resolve flow
// // // And resolve libC dependency libA, libB, libZ ---
TEST_F(LibraryResolverIT, ResolveManySymbols) {
auto Stup = LibraryResolver::Setup::create({BaseDir});
auto Driver = LibraryResolutionDriver::create(Stup);
ASSERT_NE(Driver, nullptr);
Driver->addScanPath(libdir("C"), PathType::User);
// Many duplicates to provoke concurrent updates inside SymbolQuery
std::vector<std::string> Syms = {
platformSymbolName("sayA"), platformSymbolName("sayB"),
platformSymbolName("sayA"), platformSymbolName("sayB"),
platformSymbolName("sayZ"), platformSymbolName("sayZ"),
platformSymbolName("sayZ"), platformSymbolName("sayZ"),
platformSymbolName("sayA"), platformSymbolName("sayB"),
platformSymbolName("sayA"), platformSymbolName("sayB")};
bool CallbackRan = false;
Driver->resolveSymbols(Syms, [&](SymbolQuery &Q) {
CallbackRan = true;
EXPECT_TRUE(Q.isResolved(platformSymbolName("sayA")));
EXPECT_TRUE(Q.isResolved(platformSymbolName("sayB")));
EXPECT_TRUE(Q.isResolved(platformSymbolName("sayZ")));
auto A = Q.getResolvedLib(platformSymbolName("sayA"));
auto B = Q.getResolvedLib(platformSymbolName("sayB"));
auto Z = Q.getResolvedLib(platformSymbolName("sayZ"));
ASSERT_TRUE(A.has_value());
ASSERT_TRUE(B.has_value());
ASSERT_TRUE(Z.has_value());
EXPECT_TRUE(endsWith(A->str(), libname("A")));
EXPECT_TRUE(endsWith(B->str(), libname("B")));
EXPECT_TRUE(endsWith(Z->str(), libname("Z")));
EXPECT_TRUE(Q.allResolved());
});
EXPECT_TRUE(CallbackRan);
}
// // // --- 5) Optional: stress SymbolQuery with the real resolve flow
// // // And resolve libD dependency libA ---
TEST_F(LibraryResolverIT, ResolveManySymbols2) {
auto Stup = LibraryResolver::Setup::create({BaseDir});
auto Driver = LibraryResolutionDriver::create(Stup);
ASSERT_NE(Driver, nullptr);
Driver->addScanPath(libdir("D"), PathType::User);
// Many duplicates to provoke concurrent updates inside SymbolQuery
std::vector<std::string> Syms = {
platformSymbolName("sayA"), platformSymbolName("sayB"),
platformSymbolName("sayA"), platformSymbolName("sayB"),
platformSymbolName("sayZ"), platformSymbolName("sayZ"),
platformSymbolName("sayZ"), platformSymbolName("sayZ"),
platformSymbolName("sayD"), platformSymbolName("sayD"),
platformSymbolName("sayA"), platformSymbolName("sayB"),
platformSymbolName("sayA"), platformSymbolName("sayB")};
Driver->resolveSymbols(Syms, [&](SymbolQuery &Q) {
EXPECT_TRUE(Q.isResolved(platformSymbolName("sayA")));
EXPECT_TRUE(Q.isResolved(platformSymbolName("sayD")));
auto A = Q.getResolvedLib(platformSymbolName("sayA"));
auto D = Q.getResolvedLib(platformSymbolName("sayD"));
ASSERT_TRUE(A.has_value());
ASSERT_TRUE(D.has_value());
EXPECT_TRUE(endsWith(A->str(), libname("A")));
EXPECT_TRUE(endsWith(D->str(), libname("D")));
EXPECT_FALSE(Q.allResolved());
});
}
TEST_F(LibraryResolverIT, ScanSingleUserPath) {
auto LibPathCache = std::make_shared<LibraryPathCache>();
auto PResolver = std::make_shared<PathResolver>(LibPathCache);
LibraryScanHelper ScanH({}, LibPathCache, PResolver);
ScanH.addBasePath(libdir("C"), PathType::User);
std::error_code EC;
auto libCPathOpt = PResolver->resolve(lib("C"), EC);
if (!libCPathOpt || EC) {
FAIL();
}
std::string libCPath = *libCPathOpt;
LibraryManager LibMgr;
LibraryScanner Scanner(ScanH, LibMgr);
Scanner.scanNext(PathType::User, 0);
bool found = false;
LibMgr.forEachLibrary([&](const LibraryInfo &lib) {
if (lib.getFullPath() == libCPath) {
found = true;
}
return true;
});
EXPECT_TRUE(found) << "Expected to find " << libCPath;
}
TEST_F(LibraryResolverIT, ScanAndCheckDeps) {
auto LibPathCache = std::make_shared<LibraryPathCache>();
auto PResolver = std::make_shared<PathResolver>(LibPathCache);
LibraryScanHelper ScanH({}, LibPathCache, PResolver);
ScanH.addBasePath(libdir("C"), PathType::User);
LibraryManager LibMgr;
LibraryScanner Scanner(ScanH, LibMgr);
Scanner.scanNext(PathType::User, 0);
size_t count = 0;
LibMgr.forEachLibrary([&](const LibraryInfo &) {
count++;
return true;
});
EXPECT_GE(count, 3u) << "Should find at least libA in multiple paths";
}
TEST_F(LibraryResolverIT, ScanEmptyPath) {
auto LibPathCache = std::make_shared<LibraryPathCache>();
auto PResolver = std::make_shared<PathResolver>(LibPathCache);
LibraryScanHelper ScanH({}, LibPathCache, PResolver);
ScanH.addBasePath("/tmp/empty", PathType::User);
LibraryManager LibMgr;
LibraryScanner Scanner(ScanH, LibMgr);
Scanner.scanNext(PathType::User, 0);
size_t count = 0;
LibMgr.forEachLibrary([&](const LibraryInfo &) {
count++;
return true;
});
EXPECT_EQ(count, 0u);
}
TEST_F(LibraryResolverIT, PathResolverResolvesKnownPaths) {
auto LibPathCache = std::make_shared<LibraryPathCache>();
auto PResolver = std::make_shared<PathResolver>(LibPathCache);
std::error_code EC;
auto Missing = PResolver->resolve("temp/foo/bar", EC);
EXPECT_FALSE(Missing.has_value()) << "Unexpectedly resolved a bogus path";
EXPECT_TRUE(EC) << "Expected error resolving path";
auto DirPath = PResolver->resolve(BaseDir, EC);
ASSERT_TRUE(DirPath.has_value());
EXPECT_FALSE(EC) << "Expected no error resolving path";
EXPECT_EQ(*DirPath, BaseDir);
auto DylibPath = PResolver->resolve(lib("C"), EC);
ASSERT_TRUE(DylibPath.has_value());
EXPECT_FALSE(EC) << "Expected no error resolving path";
EXPECT_EQ(*DylibPath, lib("C"));
}
TEST_F(LibraryResolverIT, PathResolverNormalizesDotAndDotDot) {
auto LibPathCache = std::make_shared<LibraryPathCache>();
auto PResolver = std::make_shared<PathResolver>(LibPathCache);
std::error_code EC;
// e.g. BaseDir + "/./C/../C/C.dylib" → BaseDir + "/C.dylib"
std::string Messy = BaseDir + "/C/./../C/./libC" + ext;
auto Resolved = PResolver->resolve(Messy, EC);
ASSERT_TRUE(Resolved.has_value());
EXPECT_FALSE(EC);
EXPECT_EQ(*Resolved, lib("C")) << "Expected realpath to collapse . and ..";
}
#if !defined(_WIN32)
TEST_F(LibraryResolverIT, PathResolverFollowsSymlinks) {
auto LibPathCache = std::make_shared<LibraryPathCache>();
auto PResolver = std::make_shared<PathResolver>(LibPathCache);
std::error_code EC;
// Create a symlink temp -> BaseDir (only if filesystem allows it)
std::string linkName = BaseDir + withext("/link_to_C");
std::string target = lib("C");
::symlink(target.c_str(), linkName.c_str());
auto resolved = PResolver->resolve(linkName, EC);
ASSERT_TRUE(resolved.has_value());
EXPECT_FALSE(EC);
EXPECT_EQ(*resolved, target);
::unlink(linkName.c_str()); // cleanup
}
TEST_F(LibraryResolverIT, PathResolverCachesResults) {
auto LibPathCache = std::make_shared<LibraryPathCache>();
auto PResolver = std::make_shared<PathResolver>(LibPathCache);
SmallString<128> TmpDylib;
sys::fs::createUniqueFile(withext("A-copy"), TmpDylib);
sys::fs::copy_file(lib("A"), TmpDylib);
std::error_code EC;
// First resolve -> should populate LibPathCache
auto first = PResolver->resolve(TmpDylib, EC);
ASSERT_TRUE(first.has_value());
// Forcefully remove the file from disk
::unlink(TmpDylib.c_str());
// Second resolve -> should still succeed from LibPathCache
auto second = PResolver->resolve(TmpDylib, EC);
EXPECT_TRUE(second.has_value());
EXPECT_EQ(*second, *first);
}
#endif
TEST_F(LibraryResolverIT, LoaderPathSubstitutionAndResolve) {
auto LibPathCache = std::make_shared<LibraryPathCache>();
auto PResolver = std::make_shared<PathResolver>(LibPathCache);
DylibSubstitutor substitutor;
substitutor.configure(libdir("C"));
#if defined(__APPLE__)
// Substitute @loader_path with BaseDir
std::string substituted =
substitutor.substitute(withext("@loader_path/libC"));
#elif defined(__linux__)
// Substitute $origin with BaseDir
std::string substituted = substitutor.substitute(withext("$ORIGIN/libC"));
#endif
ASSERT_FALSE(substituted.empty());
EXPECT_EQ(substituted, lib("C"));
// Now try resolving the substituted path
std::error_code EC;
auto resolved = PResolver->resolve(substituted, EC);
ASSERT_TRUE(resolved.has_value()) << "Expected to resolve substituted dylib";
EXPECT_EQ(*resolved, lib("C"));
EXPECT_FALSE(EC) << "Expected no error resolving substituted dylib";
}
TEST_F(LibraryResolverIT, ResolveFromUsrOrSystemPaths) {
auto LibPathCache = std::make_shared<LibraryPathCache>();
auto PResolver = std::make_shared<PathResolver>(LibPathCache);
DylibPathValidator validator(*PResolver);
std::vector<std::string> Paths = {"/foo/bar/", "temp/foo", libdir("C"),
libdir("A"), libdir("B"), libdir("Z")};
SmallVector<StringRef> P(Paths.begin(), Paths.end());
DylibResolver Resolver(validator);
Resolver.configure("", {{P, SearchPathType::UsrOrSys}});
// Check "C"
auto ValOptC = Resolver.resolve("libC", true);
EXPECT_TRUE(ValOptC.has_value());
EXPECT_EQ(*ValOptC, lib("C"));
auto ValOptCdylib = Resolver.resolve(withext("libC"));
EXPECT_TRUE(ValOptCdylib.has_value());
EXPECT_EQ(*ValOptCdylib, lib("C"));
// Check "A"
auto ValOptA = Resolver.resolve("libA", true);
EXPECT_TRUE(ValOptA.has_value());
EXPECT_EQ(*ValOptA, lib("A"));
auto ValOptAdylib = Resolver.resolve(withext("libA"));
EXPECT_TRUE(ValOptAdylib.has_value());
EXPECT_EQ(*ValOptAdylib, lib("A"));
// Check "B"
auto ValOptB = Resolver.resolve("libB", true);
EXPECT_TRUE(ValOptB.has_value());
EXPECT_EQ(*ValOptB, lib("B"));
auto ValOptBdylib = Resolver.resolve(withext("libB"));
EXPECT_TRUE(ValOptBdylib.has_value());
EXPECT_EQ(*ValOptBdylib, lib("B"));
// Check "Z"
auto ValOptZ = Resolver.resolve("libZ", true);
EXPECT_TRUE(ValOptZ.has_value());
EXPECT_EQ(*ValOptZ, lib("Z"));
auto ValOptZdylib = Resolver.resolve(withext("libZ"));
EXPECT_TRUE(ValOptZdylib.has_value());
EXPECT_EQ(*ValOptZdylib, lib("Z"));
}
#if defined(__APPLE__)
TEST_F(LibraryResolverIT, ResolveViaLoaderPathAndRPathSubstitution) {
auto LibPathCache = std::make_shared<LibraryPathCache>();
auto PResolver = std::make_shared<PathResolver>(LibPathCache);
DylibPathValidator validator(*PResolver);
std::vector<std::string> Paths = {"@loader_path/../A", "@loader_path/../B",
"@loader_path/../D", "@loader_path/../Z"};
SmallVector<StringRef> P(Paths.begin(), Paths.end());
DylibResolver Resolver(validator);
// Use only RPath config
Resolver.configure(lib("C"), {{P, SearchPathType::RPath}});
// --- Check A ---
auto ValOptA = Resolver.resolve("@rpath/libA", true);
EXPECT_TRUE(ValOptA.has_value());
EXPECT_EQ(*ValOptA, lib("A"));
auto ValOptAdylib = Resolver.resolve(withext("@rpath/libA"));
EXPECT_TRUE(ValOptAdylib.has_value());
EXPECT_EQ(*ValOptAdylib, lib("A"));
// --- Check B ---
auto ValOptB = Resolver.resolve("@rpath/libB", true);
EXPECT_TRUE(ValOptB.has_value());
EXPECT_EQ(*ValOptB, lib("B"));
auto ValOptBdylib = Resolver.resolve(withext("@rpath/libB"));
EXPECT_TRUE(ValOptBdylib.has_value());
EXPECT_EQ(*ValOptBdylib, lib("B"));
// --- Check Z ---
auto ValOptZ = Resolver.resolve("@rpath/libZ", true);
EXPECT_TRUE(ValOptZ.has_value());
EXPECT_EQ(*ValOptZ, lib("Z"));
auto ValOptZdylib = Resolver.resolve(withext("@rpath/libZ"));
EXPECT_TRUE(ValOptZdylib.has_value());
EXPECT_EQ(*ValOptZdylib, lib("Z"));
}
#endif
#if defined(__linux__)
TEST_F(LibraryResolverIT, ResolveViaOriginAndRPathSubstitution) {
auto LibPathCache = std::make_shared<LibraryPathCache>();
auto PResolver = std::make_shared<PathResolver>(LibPathCache);
DylibPathValidator validator(*PResolver);
// On Linux, $ORIGIN works like @loader_path
std::vector<std::string> Paths = {"$ORIGIN/../A", "$ORIGIN/../B",
"$ORIGIN/../D", "$ORIGIN/../Z"};
SmallVector<StringRef> P(Paths.begin(), Paths.end());
DylibResolver Resolver(validator);
// Use only RPath config
Resolver.configure(lib("C"), {{P, SearchPathType::RunPath}});
// --- Check A ---
auto ValOptA = Resolver.resolve("libA", true);
EXPECT_TRUE(ValOptA.has_value());
EXPECT_EQ(*ValOptA, lib("A"));
auto valOptASO = Resolver.resolve(withext("libA"));
EXPECT_TRUE(valOptASO.has_value());
EXPECT_EQ(*valOptASO, lib("A"));
// --- Check B ---
auto ValOptB = Resolver.resolve("libB", true);
EXPECT_TRUE(ValOptB.has_value());
EXPECT_EQ(*ValOptB, lib("B"));
auto valOptBSO = Resolver.resolve(withext("libB"));
EXPECT_TRUE(valOptBSO.has_value());
EXPECT_EQ(*valOptBSO, lib("B"));
// --- Check Z ---
auto ValOptZ = Resolver.resolve("libZ", true);
EXPECT_TRUE(ValOptZ.has_value());
EXPECT_EQ(*ValOptZ, lib("Z"));
auto valOptZSO = Resolver.resolve(withext("libZ"));
EXPECT_TRUE(valOptZSO.has_value());
EXPECT_EQ(*valOptZSO, lib("Z"));
}
#endif
} // namespace
#endif // defined(__APPLE__)