-
-
Notifications
You must be signed in to change notification settings - Fork 624
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
990dbca
commit 993f24b
Showing
26 changed files
with
974 additions
and
63 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
/* Copyright 2017 - 2024 R. Thomas | ||
* Copyright 2017 - 2024 Quarkslab | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
#include <sstream> | ||
#include "LIEF/MachO/Stub.hpp" | ||
|
||
#include "nanobind/utils.hpp" | ||
#include <nanobind/stl/string.h> | ||
#include <nanobind/stl/vector.h> | ||
|
||
#include "MachO/pyMachO.hpp" | ||
|
||
#include "pyLIEF.hpp" | ||
#include "pyErr.hpp" | ||
|
||
namespace LIEF::MachO::py { | ||
|
||
template<> | ||
void create<Stub>(nb::module_& m) { | ||
nb::class_<Stub> object(m, "Stub", | ||
R"doc( | ||
This class represents a stub entry in sections like ``__stubs,__auth_stubs``. | ||
It wraps assembly instructions which are used to access the *got* where the | ||
address of the symbol is resolved. | ||
Example: | ||
.. code-block:: text | ||
0000000236a3c1bc: ___memcpy_chk | ||
adrp x17, #0x241513aa8 | ||
add x17, x17, #0x241513aa8 | ||
ldr x16, [x17] | ||
braa x16, x17 | ||
)doc"_doc | ||
); | ||
|
||
nb::class_<Stub::target_info_t>(object, "target_info_t") | ||
.def(nb::init<>()) | ||
.def(nb::init<Header::CPU_TYPE, uint32_t>()) | ||
.def_rw("arch", &Stub::target_info_t::arch) | ||
.def_rw("subtype", &Stub::target_info_t::subtype); | ||
|
||
object | ||
.def(nb::init<Stub::target_info_t, uint64_t, std::vector<uint8_t>>(), | ||
"target_info"_a, "address"_a, "raw_stub"_a | ||
) | ||
.def_prop_ro("address", &Stub::address, | ||
"The virtual address where the stub is located"_doc | ||
) | ||
.def_prop_ro("raw", | ||
[] (const Stub& stub) { | ||
return nb::to_memoryview(stub.raw()); | ||
}, | ||
"The (raw) instructions of this entry as a memory view of bytes"_doc) | ||
|
||
.def_prop_ro("target", | ||
[] (Stub& self) { | ||
return LIEF::py::error_or(&Stub::target, self); | ||
}, | ||
R"doc( | ||
The address resolved by this stub. | ||
For instance, given this stub: | ||
.. code-block:: | ||
0x3eec: adrp x16, #4096 | ||
0x3ef0: ldr x16, [x16, #24] | ||
0x3ef4: br x16 | ||
The function returns: ``0x4018``. | ||
.. warning:: | ||
This function is only available with LIEF's extended version | ||
)doc"_doc) | ||
|
||
LIEF_DEFAULT_STR(Stub); | ||
} | ||
} |
103 changes: 103 additions & 0 deletions
103
api/python/src/nanobind/extra/random_access_iterator.hpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
#ifndef PY_LIEF_RANDOM_ACCESS_IT_H | ||
#define PY_LIEF_RANDOM_ACCESS_IT_H | ||
|
||
#include <nanobind/nanobind.h> | ||
#include <nanobind/make_iterator.h> | ||
|
||
NAMESPACE_BEGIN(NB_NAMESPACE) | ||
namespace detail { | ||
template<class Element> | ||
class TypedRandomIterator : public nanobind::iterator { | ||
public: | ||
static constexpr auto Name = const_name("collections.abc.Sequence[") + make_caster<Element>::Name + const_name("]"); | ||
TypedRandomIterator(nanobind::iterator&& it) : | ||
nanobind::iterator::iterator(std::move(it)) | ||
{} | ||
}; | ||
|
||
template <typename Access, rv_policy Policy, typename Iterator, | ||
typename Sentinel, typename ValueType, typename... Extra> | ||
struct random_iterator_state { | ||
Iterator it; | ||
Iterator begin; | ||
Sentinel end; | ||
bool first_or_done; | ||
}; | ||
|
||
template <typename Access, rv_policy Policy, typename Iterator, | ||
typename Sentinel, typename ValueType, typename... Extra> | ||
iterator make_rnd_iterator_impl(handle scope, const char *name, | ||
Iterator &&first, Sentinel &&last, | ||
Extra &&...extra) { | ||
using State = random_iterator_state<Access, Policy, Iterator, Sentinel, ValueType, Extra...>; | ||
|
||
if (!type<State>().is_valid()) { | ||
class_<State>(scope, name) | ||
.def("__iter__", [](handle h) { return h; }) | ||
.def("__len__", [](State &s) { return std::distance(s.begin, s.end); }) | ||
.def("__getitem__", | ||
[] (State& s, Py_ssize_t i) -> ValueType { | ||
const size_t size = std::distance(s.begin, s.end); | ||
if (i < 0) { | ||
i += static_cast<Py_ssize_t>(size); | ||
} | ||
if (i < 0 || static_cast<size_t>(i) >= size) { | ||
throw nanobind::index_error(); | ||
} | ||
Iterator it = s.begin + i; | ||
return Access()(it); | ||
}, std::forward<Extra>(extra)..., Policy) | ||
|
||
.def("__next__", | ||
[](State &s) -> ValueType { | ||
if (!s.first_or_done) | ||
++s.it; | ||
else | ||
s.first_or_done = false; | ||
|
||
if (s.it == s.end) { | ||
s.first_or_done = true; | ||
throw stop_iteration(); | ||
} | ||
|
||
return Access()(s.it); | ||
}, | ||
std::forward<Extra>(extra)..., | ||
Policy); | ||
} | ||
auto begin = first; | ||
return borrow<iterator>(cast(State{ std::forward<Iterator>(first), | ||
std::move(begin), | ||
std::forward<Sentinel>(last), true })); | ||
} | ||
} | ||
|
||
|
||
template <rv_policy Policy = rv_policy::reference_internal, | ||
typename Iterator, | ||
typename Sentinel, | ||
typename ValueType = typename detail::iterator_access<Iterator>::result_type, | ||
typename... Extra> | ||
detail::TypedRandomIterator<ValueType> make_random_access_iterator(handle scope, const char *name, Iterator &&first, Sentinel &&last, Extra &&...extra) { | ||
return detail::make_rnd_iterator_impl<detail::iterator_access<Iterator>, Policy, | ||
Iterator, Sentinel, ValueType, Extra...>( | ||
scope, name, std::forward<Iterator>(first), | ||
std::forward<Sentinel>(last), std::forward<Extra>(extra)...); | ||
} | ||
|
||
template <rv_policy Policy = rv_policy::reference_internal, | ||
typename Type, | ||
typename ValueType = typename detail::iterator_access<typename Type::IteratorTy>::result_type, | ||
typename... Extra> | ||
detail::TypedRandomIterator<ValueType> make_random_access_iterator( | ||
handle scope, const char *name, Type &value, Extra &&...extra) | ||
{ | ||
return make_random_access_iterator<Policy>( | ||
scope, name, std::begin(value), std::end(value), | ||
std::forward<Extra>(extra)... | ||
); | ||
} | ||
|
||
NAMESPACE_END(NB_NAMESPACE) | ||
|
||
#endif |
Oops, something went wrong.