summaryrefslogtreecommitdiffstats
path: root/src/patchelf.cc
diff options
context:
space:
mode:
authorTuomas Tynkkynen <tuomas@tuxera.com>2016-06-03 21:25:02 (GMT)
committerTuomas Tynkkynen <tuomas@tuxera.com>2016-06-03 21:25:02 (GMT)
commit48143414941d91016efca2b0ef6f32475d6eaa75 (patch)
treeb1348f8591c5f723404811adfdceba8df12c3616 /src/patchelf.cc
parent2e3fdc2030c75c19df6fc2924083cfad53856562 (diff)
downloadpatchelf-48143414941d91016efca2b0ef6f32475d6eaa75.zip
patchelf-48143414941d91016efca2b0ef6f32475d6eaa75.tar.gz
patchelf-48143414941d91016efca2b0ef6f32475d6eaa75.tar.bz2
Add '--allowed-rpath-prefixes' option to '--shrink-rpath'
Fixes #97. In essence, the problem is that some packages in Nixpkgs have RPATHs pointing to both $NIX_BUILD_TOP and $out, e.g.: /tmp/nix-build-openldap-2.4.44.drv-0/openldap-2.4.44/libraries/libldap_r/.libs /tmp/nix-build-openldap-2.4.44.drv-0/openldap-2.4.44/libraries/liblber/.libs /nix/store/bfkmdxmv3a3f0g3d2q8jkdz2wam93c5z-openldap-2.4.44/lib /nix/store/bfkmdxmv3a3f0g3d2q8jkdz2wam93c5z-openldap-2.4.44/lib64 Currently, running `patchelf --shrink-rpath` does the wrong thing by keeping the /tmp/ paths and deleting the /nix/store ones. Now we can fix the problem by using patchelf --shrink-rpath --allowed-rpath-prefixes $NIX_STORE_DIR in the Nixpkgs fixupPhase instead.
Diffstat (limited to 'src/patchelf.cc')
-rw-r--r--src/patchelf.cc32
1 files changed, 26 insertions, 6 deletions
diff --git a/src/patchelf.cc b/src/patchelf.cc
index b4e3e18..a59c12d 100644
--- a/src/patchelf.cc
+++ b/src/patchelf.cc
@@ -72,6 +72,13 @@ static vector<string> splitColonDelimitedString(const char * s){
return parts;
}
+static bool hasAllowedPrefix(const string & s, const vector<string> & allowedPrefixes){
+ for (vector<string>::const_iterator it = allowedPrefixes.begin(); it != allowedPrefixes.end(); ++it) {
+ if (!s.compare(0, it->size(), *it)) return true;
+ }
+ return false;
+}
+
static unsigned int getPageSize(){
return pageSize;
@@ -185,7 +192,7 @@ public:
typedef enum { rpPrint, rpShrink, rpSet, rpRemove } RPathOp;
- void modifyRPath(RPathOp op, string newRPath);
+ void modifyRPath(RPathOp op, vector<string> allowedRpathPrefixes, string newRPath);
void addNeeded(set<string> libs);
@@ -1043,7 +1050,7 @@ static void concatToRPath(string & rpath, const string & path)
template<ElfFileParams>
-void ElfFile<ElfFileParamNames>::modifyRPath(RPathOp op, string newRPath)
+void ElfFile<ElfFileParamNames>::modifyRPath(RPathOp op, vector<string> allowedRpathPrefixes, string newRPath)
{
Elf_Shdr & shdrDynamic = findSection(".dynamic");
@@ -1122,6 +1129,13 @@ void ElfFile<ElfFileParamNames>::modifyRPath(RPathOp op, string newRPath)
continue;
}
+ /* If --allowed-rpath-prefixes was given, reject directories
+ not starting with any of the (colon-delimited) prefixes. */
+ if (!allowedRpathPrefixes.empty() && !hasAllowedPrefix(dirName, allowedRpathPrefixes)) {
+ debug("removing directory '%s' from RPATH because of non-allowed prefix\n", dirName.c_str());
+ continue;
+ }
+
/* For each library that we haven't found yet, see if it
exists in this directory. */
bool libFound = false;
@@ -1465,6 +1479,7 @@ static bool setSoname = false;
static string newSoname;
static string newInterpreter;
static bool shrinkRPath = false;
+static vector<string> allowedRpathPrefixes;
static bool removeRPath = false;
static bool setRPath = false;
static bool printRPath = false;
@@ -1493,14 +1508,14 @@ static void patchElf2(ElfFile & elfFile)
elfFile.setInterpreter(newInterpreter);
if (printRPath)
- elfFile.modifyRPath(elfFile.rpPrint, "");
+ elfFile.modifyRPath(elfFile.rpPrint, vector<string>(), "");
if (shrinkRPath)
- elfFile.modifyRPath(elfFile.rpShrink, "");
+ elfFile.modifyRPath(elfFile.rpShrink, allowedRpathPrefixes, "");
else if (removeRPath)
- elfFile.modifyRPath(elfFile.rpRemove, "");
+ elfFile.modifyRPath(elfFile.rpRemove, vector<string>(), "");
else if (setRPath)
- elfFile.modifyRPath(elfFile.rpSet, newRPath);
+ elfFile.modifyRPath(elfFile.rpSet, vector<string>(), newRPath);
if (printNeeded) elfFile.printNeededLibs();
@@ -1563,6 +1578,7 @@ void showHelp(const string & progName)
[--set-rpath RPATH]\n\
[--remove-rpath]\n\
[--shrink-rpath]\n\
+ [--allowed-rpath-prefixes PREFIXES]\t\tWith '--shrink-rpath', reject rpath entries not starting with the allowed prefix\n\
[--print-rpath]\n\
[--force-rpath]\n\
[--add-needed LIBRARY]\n\
@@ -1614,6 +1630,10 @@ int main(int argc, char * * argv)
else if (arg == "--shrink-rpath") {
shrinkRPath = true;
}
+ else if (arg == "--allowed-rpath-prefixes") {
+ if (++i == argc) error("missing argument");
+ allowedRpathPrefixes = splitColonDelimitedString(argv[i]);
+ }
else if (arg == "--set-rpath") {
if (++i == argc) error("missing argument");
setRPath = true;