TEST(Ldd, EmptyCache) { vector<ldcache::Entry> cache; Try<hashset<string>> dependencies = ldd("/bin/sh", cache); ASSERT_ERROR(dependencies); }
inline void MacroAssembler::ld_long(const Address& a, Register d, int offset) { #ifdef _LP64 ldx(a, d, offset); #else ldd(a, d, offset); #endif }
inline void MacroAssembler::ld_long( Register s1, RegisterOrConstant s2, Register d ) { #ifdef _LP64 ldx(s1, s2, d); #else ldd(s1, s2, d); #endif }
TEST(Ldd, MissingFile) { Try<vector<ldcache::Entry>> cache = ldcache::parse(); ASSERT_SOME(cache); Try<hashset<string>> dependencies = ldd("/this/path/is/not/here", cache.get()); ASSERT_ERROR(dependencies); }
TEST(Ldd, BinSh) { Try<vector<ldcache::Entry>> cache = ldcache::parse(); ASSERT_SOME(cache); Try<hashset<string>> dependencies = ldd("/bin/sh", cache.get()); ASSERT_SOME(dependencies); EXPECT_FALSE(dependencies->contains("/bin/sh")); auto libc = std::find_if( dependencies->begin(), dependencies->end(), [](const string& dependency) { // On most Linux systems, libc would be in libc.so.6, but // checking the unversioned prefix is robust and is enough // to know that ldd() worked. string basename = Path(dependency).basename(); return strings::startsWith(basename, "libc.so"); }); EXPECT_TRUE(libc != dependencies->end()); }
inline void MacroAssembler::ldd( Register s1, RegisterOrConstant s2, Register d) { ldd( Address(s1, s2), d); }
inline void MacroAssembler::ldd( const Address& a, Register d, int offset) { if (a.has_index()) { assert(offset == 0, ""); ldd( a.base(), a.index(), d); } else { ldd( a.base(), a.disp() + offset, d); } }