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:
parent
e40f215573
commit
8db1aabf8b
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
|
||||
@ -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
@ -25,7 +25,6 @@ add_llvm_unittest(OrcJITTests
|
||||
IndirectionUtilsTest.cpp
|
||||
JITTargetMachineBuilderTest.cpp
|
||||
LazyCallThroughAndReexportsTest.cpp
|
||||
LibraryResolverTest.cpp
|
||||
LookupAndRecordAddrsTest.cpp
|
||||
MachOPlatformTest.cpp
|
||||
MapperJITLinkMemoryManagerTest.cpp
|
||||
|
||||
@ -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
|
||||
...
|
||||
@ -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 ]
|
||||
...
|
||||
@ -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
|
||||
...
|
||||
@ -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 ]
|
||||
...
|
||||
@ -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
|
||||
...
|
||||
@ -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 ]
|
||||
...
|
||||
@ -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
|
||||
...
|
||||
@ -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 ]
|
||||
...
|
||||
@ -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
|
||||
...
|
||||
@ -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 ]
|
||||
...
|
||||
@ -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__)
|
||||
Loading…
x
Reference in New Issue
Block a user