blob: 2d6ff80e72fe1b183d658ec278cdeee9913e1048 [file] [log] [blame]
// Copyright 2023 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <lib/elfldltl/resolve.h>
#include "load-tests.h"
namespace ld::testing {
namespace {
static_assert(ld::kResolverPolicy == elfldltl::ResolverPolicy::kStrongOverWeak);
TYPED_TEST(LdLoadTests, Relative) {
constexpr int64_t kReturnValue = 17;
ASSERT_NO_FATAL_FAILURE(this->Init());
ASSERT_NO_FATAL_FAILURE(this->Load("relative-reloc"));
EXPECT_EQ(this->Run(), kReturnValue);
this->ExpectLog("");
}
TYPED_TEST(LdLoadTests, Symbolic) {
constexpr int64_t kReturnValue = 17;
ASSERT_NO_FATAL_FAILURE(this->Init());
ASSERT_NO_FATAL_FAILURE(this->Load("symbolic-reloc"));
EXPECT_EQ(this->Run(), kReturnValue);
this->ExpectLog("");
}
TYPED_TEST(LdLoadTests, SymbolicNamespace) {
constexpr int64_t kReturnValue = 17;
ASSERT_NO_FATAL_FAILURE(this->Init());
ASSERT_NO_FATAL_FAILURE(this->Needed({"libld-dep-a.so"}));
ASSERT_NO_FATAL_FAILURE(this->Load("symbolic-namespace"));
EXPECT_EQ(this->Run(), kReturnValue);
this->ExpectLog("");
}
TYPED_TEST(LdLoadTests, OneWeakSymbol) {
constexpr int64_t kFooV1ReturnValue = 2;
constexpr int64_t kFooV2ReturnValue = 7;
ASSERT_NO_FATAL_FAILURE(this->Init());
ASSERT_NO_FATAL_FAILURE(this->Needed({"libld-dep-foo-v1-weak.so", "libld-dep-foo-v2.so"}));
ASSERT_NO_FATAL_FAILURE(this->Load("one-weak-symbol"));
switch (TestFixture::kResolverPolicy) {
case elfldltl::ResolverPolicy::kStrictLinkOrder: {
EXPECT_EQ(this->Run(), kFooV1ReturnValue);
break;
}
case elfldltl::ResolverPolicy::kStrongOverWeak: {
EXPECT_EQ(this->Run(), kFooV2ReturnValue);
break;
}
}
this->ExpectLog("");
}
TYPED_TEST(LdLoadTests, AllWeakSymbols) {
constexpr int64_t kFooV1ReturnValue = 2;
ASSERT_NO_FATAL_FAILURE(this->Init());
ASSERT_NO_FATAL_FAILURE(this->Needed({"libld-dep-foo-v1-weak.so", "libld-dep-foo-v2-weak.so"}));
ASSERT_NO_FATAL_FAILURE(this->Load("all-weak-symbols"));
EXPECT_EQ(this->Run(), kFooV1ReturnValue);
this->ExpectLog("");
}
} // namespace
} // namespace ld::testing