file(RPATH_CHANGE ...): no-op for static binary

Setting `CMAKE_INSTALL_RPATH` on a project that contains statically
linked executables breaks the install step, since rpaths cannot be
changed.

This commit makes rpath adjustments not an error on static libraries.

Fixes #26078
This commit is contained in:
Harmen Stoppels
2024-06-24 16:18:46 +02:00
committed by Brad King
parent ccbbf64552
commit 02f3e5be6a
5 changed files with 19 additions and 1 deletions

View File

@@ -112,6 +112,9 @@ public:
virtual bool IsMips() const = 0;
virtual void PrintInfo(std::ostream& os) const = 0;
/** Returns true if the ELF file has a dynamic section **/
bool HasDynamicSection() const { return this->DynamicSectionIndex >= 0; }
// Lookup the SONAME in the DYNAMIC section.
StringEntry const* GetSOName()
{
@@ -461,7 +464,7 @@ template <class Types>
bool cmELFInternalImpl<Types>::LoadDynamicSection()
{
// If there is no dynamic section we are done.
if (this->DynamicSectionIndex < 0) {
if (!this->HasDynamicSection()) {
return false;
}
@@ -772,6 +775,11 @@ std::vector<char> cmELF::EncodeDynamicEntries(
return std::vector<char>();
}
bool cmELF::HasDynamicSection() const
{
return this->Valid() && this->Internal->HasDynamicSection();
}
bool cmELF::GetSOName(std::string& soname)
{
if (StringEntry const* se = this->GetSOName()) {

View File

@@ -88,6 +88,9 @@ public:
std::vector<char> EncodeDynamicEntries(
const DynamicEntryList& entries) const;
/** Returns true if the ELF file has a dynamic section **/
bool HasDynamicSection() const;
/** Get the SONAME field if any. */
bool GetSOName(std::string& soname);
StringEntry const* GetSOName();

View File

@@ -2817,6 +2817,10 @@ cm::optional<bool> AdjustRPathELF(std::string const& file,
return cm::nullopt; // Not a valid ELF file.
}
if (!elf.HasDynamicSection()) {
return true; // No dynamic section to update.
}
// Get the RPATH and RUNPATH entries from it.
int se_count = 0;
cmELF::StringEntry const* se[2] = { nullptr, nullptr };

View File

@@ -4,6 +4,9 @@ set(dynamic
elf64lsb.bin
elf64msb.bin
)
set(static
elf64lsb-static.bin
)
set(format ELF)
include(${CMAKE_CURRENT_LIST_DIR}/Common.cmake)

Binary file not shown.