mirror of
https://github.com/matrix-construct/construct
synced 2024-12-26 07:23:53 +01:00
ircd::mods::ldso: Add a DT_NEEDED iterator.
This commit is contained in:
parent
8a69adb9c5
commit
8a6e9158fe
3 changed files with 56 additions and 0 deletions
|
@ -28,6 +28,7 @@ namespace ircd::mods::ldso
|
|||
IRCD_EXCEPTION(error, not_found);
|
||||
|
||||
using link_closure = std::function<bool (struct link_map &)>;
|
||||
using string_closure = std::function<bool (const string_view &)>;
|
||||
using semantic_version = std::array<long, 3>;
|
||||
|
||||
// Util
|
||||
|
@ -52,4 +53,5 @@ namespace ircd::mods::ldso
|
|||
|
||||
// Query link
|
||||
string_view string(const struct link_map &, const size_t &idx);
|
||||
bool for_each_needed(const struct link_map &, const string_closure &);
|
||||
}
|
||||
|
|
|
@ -21,6 +21,33 @@
|
|||
// mods/ldso.h
|
||||
//
|
||||
|
||||
bool
|
||||
ircd::mods::ldso::for_each_needed(const struct link_map &map,
|
||||
const string_closure &closure)
|
||||
{
|
||||
const char *strtab {nullptr};
|
||||
for(auto d(map.l_ld); d->d_tag != DT_NULL; ++d)
|
||||
if(d->d_tag == DT_STRTAB)
|
||||
{
|
||||
strtab = reinterpret_cast<const char *>(d->d_un.d_ptr);
|
||||
break;
|
||||
}
|
||||
|
||||
if(!strtab)
|
||||
return true;
|
||||
|
||||
for(auto d(map.l_ld); d->d_tag != DT_NULL; ++d)
|
||||
{
|
||||
if(d->d_tag != DT_NEEDED)
|
||||
continue;
|
||||
|
||||
if(!closure(strtab + d->d_un.d_val))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
ircd::string_view
|
||||
ircd::mods::ldso::string(const struct link_map &map,
|
||||
const size_t &idx)
|
||||
|
|
|
@ -1690,6 +1690,33 @@ console_cmd__mod__links(opt &out, const string_view &line)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
console_cmd__mod__needed(opt &out, const string_view &line)
|
||||
{
|
||||
const params param{line, " ",
|
||||
{
|
||||
"name"
|
||||
}};
|
||||
|
||||
const string_view name
|
||||
{
|
||||
param.at("name")
|
||||
};
|
||||
|
||||
size_t i(0);
|
||||
mods::ldso::for_each_needed(mods::ldso::get(name), [&out, &i]
|
||||
(const string_view &name)
|
||||
{
|
||||
out << std::setw(2) << (i++)
|
||||
<< " " << name
|
||||
<< std::endl;
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//
|
||||
// ctx
|
||||
//
|
||||
|
|
Loading…
Reference in a new issue