summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/patchelf.cc212
1 files changed, 104 insertions, 108 deletions
diff --git a/src/patchelf.cc b/src/patchelf.cc
index 2903033..c18ff3e 100644
--- a/src/patchelf.cc
+++ b/src/patchelf.cc
@@ -38,16 +38,12 @@
#include "elf.h"
-using namespace std;
-
-
-
static bool debugMode = false;
static bool forceRPath = false;
-static string fileName;
+static std::string fileName;
static int pageSize = PAGESIZE;
typedef std::shared_ptr<std::vector<unsigned char>> FileContents;
@@ -57,15 +53,15 @@ typedef std::shared_ptr<std::vector<unsigned char>> FileContents;
#define ElfFileParamNames Elf_Ehdr, Elf_Phdr, Elf_Shdr, Elf_Addr, Elf_Off, Elf_Dyn, Elf_Sym, Elf_Verneed
-static vector<string> splitColonDelimitedString(const char * s)
+static std::vector<std::string> splitColonDelimitedString(const char * s)
{
- vector<string> parts;
+ std::vector<std::string> parts;
const char * pos = s;
while (*pos) {
const char * end = strchr(pos, ':');
if (!end) end = strchr(pos, 0);
- parts.push_back(string(pos, end - pos));
+ parts.push_back(std::string(pos, end - pos));
if (*end == ':') ++end;
pos = end;
}
@@ -73,11 +69,10 @@ static vector<string> splitColonDelimitedString(const char * s)
return parts;
}
-static bool hasAllowedPrefix(const string & s, const vector<string> & allowedPrefixes)
+static bool hasAllowedPrefix(const std::string & s, const std::vector<std::string> & allowedPrefixes)
{
- for (vector<string>::const_iterator it = allowedPrefixes.begin(); it != allowedPrefixes.end(); ++it) {
- if (!s.compare(0, it->size(), *it)) return true;
- }
+ for (auto & i : allowedPrefixes)
+ if (!s.compare(0, i.size(), i)) return true;
return false;
}
@@ -100,8 +95,8 @@ private:
unsigned char * contents;
Elf_Ehdr * hdr;
- vector<Elf_Phdr> phdrs;
- vector<Elf_Shdr> shdrs;
+ std::vector<Elf_Phdr> phdrs;
+ std::vector<Elf_Shdr> shdrs;
bool littleEndian;
@@ -109,18 +104,18 @@ private:
bool isExecutable = false;
- typedef string SectionName;
- typedef map<SectionName, string> ReplacedSections;
+ typedef std::string SectionName;
+ typedef std::map<SectionName, std::string> ReplacedSections;
ReplacedSections replacedSections;
- string sectionNames; /* content of the .shstrtab section */
+ std::string sectionNames; /* content of the .shstrtab section */
/* Align on 4 or 8 bytes boundaries on 32- or 64-bit platforms
respectively. */
size_t sectionAlignment = sizeof(Elf_Off);
- vector<SectionName> sectionsByOldIndex;
+ std::vector<SectionName> sectionsByOldIndex;
public:
@@ -163,7 +158,7 @@ private:
void shiftFile(unsigned int extraPages, Elf_Addr startPage);
- string getSectionName(const Elf_Shdr & shdr);
+ std::string getSectionName(const Elf_Shdr & shdr);
Elf_Shdr & findSection(const SectionName & sectionName);
@@ -171,7 +166,7 @@ private:
unsigned int findSection3(const SectionName & sectionName);
- string & replaceSection(const SectionName & sectionName,
+ std::string & replaceSection(const SectionName & sectionName,
unsigned int size);
void writeReplacedSections(Elf_Off & curOff,
@@ -187,23 +182,23 @@ public:
void rewriteSections();
- string getInterpreter();
+ std::string getInterpreter();
typedef enum { printSoname, replaceSoname } sonameMode;
- void modifySoname(sonameMode op, const string & newSoname);
+ void modifySoname(sonameMode op, const std::string & newSoname);
- void setInterpreter(const string & newInterpreter);
+ void setInterpreter(const std::string & newInterpreter);
typedef enum { rpPrint, rpShrink, rpSet, rpRemove } RPathOp;
- void modifyRPath(RPathOp op, vector<string> allowedRpathPrefixes, string newRPath);
+ void modifyRPath(RPathOp op, const std::vector<std::string> & allowedRpathPrefixes, std::string newRPath);
- void addNeeded(set<string> libs);
+ void addNeeded(const std::set<std::string> & libs);
- void removeNeeded(set<string> libs);
+ void removeNeeded(const std::set<std::string> & libs);
- void replaceNeeded(map<string, string>& libs);
+ void replaceNeeded(const std::map<std::string, std::string> & libs);
void printNeededLibs();
@@ -262,7 +257,7 @@ static void debug(const char * format, ...)
}
-__attribute__((noreturn)) static void error(string msg)
+__attribute__((noreturn)) static void error(std::string msg)
{
if (errno) perror(msg.c_str()); else fprintf(stderr, "%s\n", msg.c_str());
exit(1);
@@ -277,7 +272,7 @@ static void growFile(FileContents contents, size_t newSize)
}
-static FileContents readFile(string fileName)
+static FileContents readFile(std::string fileName)
{
struct stat st;
if (stat(fileName.c_str(), &st) != 0) error("stat");
@@ -352,7 +347,7 @@ ElfFile<ElfFileParamNames>::ElfFile(FileContents fileContents)
assert(shstrtabSize > 0);
assert(shstrtab[shstrtabSize - 1] == 0);
- sectionNames = string(shstrtab, shstrtabSize);
+ sectionNames = std::string(shstrtab, shstrtabSize);
sectionsByOldIndex.resize(hdr->e_shnum);
for (unsigned int i = 1; i < rdi(hdr->e_shnum); ++i)
@@ -375,13 +370,13 @@ void ElfFile<ElfFileParamNames>::sortShdrs()
{
/* Translate sh_link mappings to section names, since sorting the
sections will invalidate the sh_link fields. */
- map<SectionName, SectionName> linkage;
+ std::map<SectionName, SectionName> linkage;
for (unsigned int i = 1; i < rdi(hdr->e_shnum); ++i)
if (rdi(shdrs[i].sh_link) != 0)
linkage[getSectionName(shdrs[i])] = getSectionName(shdrs[rdi(shdrs[i].sh_link)]);
/* Idem for sh_info on certain sections. */
- map<SectionName, SectionName> info;
+ std::map<SectionName, SectionName> info;
for (unsigned int i = 1; i < rdi(hdr->e_shnum); ++i)
if (rdi(shdrs[i].sh_info) != 0 &&
(rdi(shdrs[i].sh_type) == SHT_REL || rdi(shdrs[i].sh_type) == SHT_RELA))
@@ -413,7 +408,7 @@ void ElfFile<ElfFileParamNames>::sortShdrs()
}
-static void writeFile(string fileName, FileContents contents)
+static void writeFile(std::string fileName, FileContents contents)
{
int fd = open(fileName.c_str(), O_TRUNC | O_WRONLY);
if (fd == -1)
@@ -478,9 +473,9 @@ void ElfFile<ElfFileParamNames>::shiftFile(unsigned int extraPages, Elf_Addr sta
template<ElfFileParams>
-string ElfFile<ElfFileParamNames>::getSectionName(const Elf_Shdr & shdr)
+std::string ElfFile<ElfFileParamNames>::getSectionName(const Elf_Shdr & shdr)
{
- return string(sectionNames.c_str() + rdi(shdr.sh_name));
+ return std::string(sectionNames.c_str() + rdi(shdr.sh_name));
}
@@ -512,17 +507,17 @@ unsigned int ElfFile<ElfFileParamNames>::findSection3(const SectionName & sectio
template<ElfFileParams>
-string & ElfFile<ElfFileParamNames>::replaceSection(const SectionName & sectionName,
+std::string & ElfFile<ElfFileParamNames>::replaceSection(const SectionName & sectionName,
unsigned int size)
{
ReplacedSections::iterator i = replacedSections.find(sectionName);
- string s;
+ std::string s;
if (i != replacedSections.end()) {
- s = string(i->second);
+ s = std::string(i->second);
} else {
Elf_Shdr & shdr = findSection(sectionName);
- s = string((char *) contents + rdi(shdr.sh_offset), rdi(shdr.sh_size));
+ s = std::string((char *) contents + rdi(shdr.sh_offset), rdi(shdr.sh_size));
}
s.resize(size);
@@ -542,7 +537,7 @@ void ElfFile<ElfFileParamNames>::writeReplacedSections(Elf_Off & curOff,
for (ReplacedSections::iterator i = replacedSections.begin();
i != replacedSections.end(); ++i)
{
- string sectionName = i->first;
+ std::string sectionName = i->first;
Elf_Shdr & shdr = findSection(sectionName);
memset(contents + rdi(shdr.sh_offset), 'X', rdi(shdr.sh_size));
}
@@ -550,7 +545,7 @@ void ElfFile<ElfFileParamNames>::writeReplacedSections(Elf_Off & curOff,
for (ReplacedSections::iterator i = replacedSections.begin();
i != replacedSections.end(); ++i)
{
- string sectionName = i->first;
+ std::string sectionName = i->first;
Elf_Shdr & shdr = findSection(sectionName);
debug("rewriting section '%s' from offset 0x%x (size %d) to offset 0x%x (size %d)\n",
sectionName.c_str(), rdi(shdr.sh_offset), rdi(shdr.sh_size), curOff, i->second.size());
@@ -689,7 +684,7 @@ void ElfFile<ElfFileParamNames>::rewriteSectionsExecutable()
/* What is the index of the last replaced section? */
unsigned int lastReplaced = 0;
for (unsigned int i = 1; i < rdi(hdr->e_shnum); ++i) {
- string sectionName = getSectionName(shdrs[i]);
+ std::string sectionName = getSectionName(shdrs[i]);
if (replacedSections.find(sectionName) != replacedSections.end()) {
debug("using replaced section '%s'\n", sectionName.c_str());
lastReplaced = i;
@@ -707,10 +702,10 @@ void ElfFile<ElfFileParamNames>::rewriteSectionsExecutable()
assert(lastReplaced + 1 < shdrs.size()); /* !!! I'm lazy. */
size_t startOffset = rdi(shdrs[lastReplaced + 1].sh_offset);
Elf_Addr startAddr = rdi(shdrs[lastReplaced + 1].sh_addr);
- string prevSection;
+ std::string prevSection;
for (unsigned int i = 1; i <= lastReplaced; ++i) {
Elf_Shdr & shdr(shdrs[i]);
- string sectionName = getSectionName(shdr);
+ std::string sectionName = getSectionName(shdr);
debug("looking at section '%s'\n", sectionName.c_str());
/* !!! Why do we stop after a .dynstr section? I can't
remember! */
@@ -913,7 +908,7 @@ void ElfFile<ElfFileParamNames>::rewriteHeaders(Elf_Addr phdrAddress)
fprintf(stderr, "warning: entry %d in symbol table refers to a non-existent section, skipping\n", shndx);
continue;
}
- string section = sectionsByOldIndex.at(shndx);
+ std::string section = sectionsByOldIndex.at(shndx);
assert(!section.empty());
unsigned int newIndex = findSection3(section); // inefficient
//debug("rewriting symbol %d: index = %d (%s) -> %d\n", entry, shndx, section.c_str(), newIndex);
@@ -929,7 +924,7 @@ void ElfFile<ElfFileParamNames>::rewriteHeaders(Elf_Addr phdrAddress)
-static void setSubstr(string & s, unsigned int pos, const string & t)
+static void setSubstr(std::string & s, unsigned int pos, const std::string & t)
{
assert(pos + t.size() <= s.size());
copy(t.begin(), t.end(), s.begin() + pos);
@@ -937,14 +932,14 @@ static void setSubstr(string & s, unsigned int pos, const string & t)
template<ElfFileParams>
-string ElfFile<ElfFileParamNames>::getInterpreter()
+std::string ElfFile<ElfFileParamNames>::getInterpreter()
{
Elf_Shdr & shdr = findSection(".interp");
- return string((char *) contents + rdi(shdr.sh_offset), rdi(shdr.sh_size));
+ return std::string((char *) contents + rdi(shdr.sh_offset), rdi(shdr.sh_size));
}
template<ElfFileParams>
-void ElfFile<ElfFileParamNames>::modifySoname(sonameMode op, const string & newSoname)
+void ElfFile<ElfFileParamNames>::modifySoname(sonameMode op, const std::string & newSoname)
{
if (rdi(hdr->e_type) != ET_DYN) {
debug("this is not a dynamic library\n");
@@ -968,7 +963,7 @@ void ElfFile<ElfFileParamNames>::modifySoname(sonameMode op, const string & newS
assert(strTabAddr == rdi(shdrDynStr.sh_addr));
/* Walk through the dynamic section, look for the DT_SONAME entry. */
- static vector<string> neededLibs;
+ static std::vector<std::string> neededLibs;
dyn = (Elf_Dyn *) (contents + rdi(shdrDynamic.sh_offset));
Elf_Dyn * dynSoname = 0;
char * soname = 0;
@@ -977,12 +972,12 @@ void ElfFile<ElfFileParamNames>::modifySoname(sonameMode op, const string & newS
dynSoname = dyn;
soname = strTab + rdi(dyn->d_un.d_val);
} else if (rdi(dyn->d_tag) == DT_INIT)
- neededLibs.push_back(string(strTab + rdi(dyn->d_un.d_val)));
+ neededLibs.push_back(std::string(strTab + rdi(dyn->d_un.d_val)));
}
if (op == printSoname) {
if (soname) {
- if (string(soname ? soname : "") == "")
+ if (std::string(soname ? soname : "") == "")
debug("DT_SONAME is empty\n");
else
printf("%s\n", soname);
@@ -992,7 +987,7 @@ void ElfFile<ElfFileParamNames>::modifySoname(sonameMode op, const string & newS
return;
}
- if (string(soname ? soname : "") == newSoname) {
+ if (std::string(soname ? soname : "") == newSoname) {
debug("current and proposed new SONAMEs are equal keeping DT_SONAME entry\n");
return;
}
@@ -1009,7 +1004,7 @@ void ElfFile<ElfFileParamNames>::modifySoname(sonameMode op, const string & newS
/* Grow the .dynstr section to make room for the new SONAME. */
debug("SONAME is too long, resizing...\n");
- string & newDynStr = replaceSection(".dynstr", rdi(shdrDynStr.sh_size) + newSoname.size() + 1);
+ std::string & newDynStr = replaceSection(".dynstr", rdi(shdrDynStr.sh_size) + newSoname.size() + 1);
setSubstr(newDynStr, rdi(shdrDynStr.sh_size), newSoname + '\0');
/* Update the DT_SONAME entry. */
@@ -1018,35 +1013,35 @@ void ElfFile<ElfFileParamNames>::modifySoname(sonameMode op, const string & newS
} else {
/* There is no DT_SONAME entry in the .dynamic section, so we
have to grow the .dynamic section. */
- string & newDynamic = replaceSection(".dynamic", rdi(shdrDynamic.sh_size) + sizeof(Elf_Dyn));
+ std::string & newDynamic = replaceSection(".dynamic", rdi(shdrDynamic.sh_size) + sizeof(Elf_Dyn));
unsigned int idx = 0;
for (; rdi(((Elf_Dyn *) newDynamic.c_str())[idx].d_tag) != DT_NULL; idx++);
debug("DT_NULL index is %d\n", idx);
/* Shift all entries down by one. */
- setSubstr(newDynamic, sizeof(Elf_Dyn), string(newDynamic, 0, sizeof(Elf_Dyn) * (idx + 1)));
+ setSubstr(newDynamic, sizeof(Elf_Dyn), std::string(newDynamic, 0, sizeof(Elf_Dyn) * (idx + 1)));
/* Add the DT_SONAME entry at the top. */
Elf_Dyn newDyn;
wri(newDyn.d_tag, DT_SONAME);
newDyn.d_un.d_val = shdrDynStr.sh_size;
- setSubstr(newDynamic, 0, string((char *)&newDyn, sizeof(Elf_Dyn)));
+ setSubstr(newDynamic, 0, std::string((char *)&newDyn, sizeof(Elf_Dyn)));
}
changed = true;
}
template<ElfFileParams>
-void ElfFile<ElfFileParamNames>::setInterpreter(const string & newInterpreter)
+void ElfFile<ElfFileParamNames>::setInterpreter(const std::string & newInterpreter)
{
- string & section = replaceSection(".interp", newInterpreter.size() + 1);
+ std::string & section = replaceSection(".interp", newInterpreter.size() + 1);
setSubstr(section, 0, newInterpreter + '\0');
changed = true;
}
-static void concatToRPath(string & rpath, const string & path)
+static void concatToRPath(std::string & rpath, const std::string & path)
{
if (!rpath.empty()) rpath += ":";
rpath += path;
@@ -1054,7 +1049,8 @@ static void concatToRPath(string & rpath, const string & path)
template<ElfFileParams>
-void ElfFile<ElfFileParamNames>::modifyRPath(RPathOp op, vector<string> allowedRpathPrefixes, string newRPath)
+void ElfFile<ElfFileParamNames>::modifyRPath(RPathOp op,
+ const std::vector<std::string> & allowedRpathPrefixes, std::string newRPath)
{
Elf_Shdr & shdrDynamic = findSection(".dynamic");
@@ -1085,7 +1081,7 @@ void ElfFile<ElfFileParamNames>::modifyRPath(RPathOp op, vector<string> allowedR
unless you use its '--enable-new-dtag' option, in which case it
generates a DT_RPATH and DT_RUNPATH pointing at the same
string. */
- static vector<string> neededLibs;
+ static std::vector<std::string> neededLibs;
dyn = (Elf_Dyn *) (contents + rdi(shdrDynamic.sh_offset));
Elf_Dyn * dynRPath = 0, * dynRunPath = 0;
char * rpath = 0;
@@ -1101,7 +1097,7 @@ void ElfFile<ElfFileParamNames>::modifyRPath(RPathOp op, vector<string> allowedR
rpath = strTab + rdi(dyn->d_un.d_val);
}
else if (rdi(dyn->d_tag) == DT_NEEDED)
- neededLibs.push_back(string(strTab + rdi(dyn->d_un.d_val)));
+ neededLibs.push_back(std::string(strTab + rdi(dyn->d_un.d_val)));
}
if (op == rpPrint) {
@@ -1118,7 +1114,7 @@ void ElfFile<ElfFileParamNames>::modifyRPath(RPathOp op, vector<string> allowedR
/* For each directory in the RPATH, check if it contains any
needed library. */
if (op == rpShrink) {
- static vector<bool> neededLibFound(neededLibs.size(), false);
+ static std::vector<bool> neededLibFound(neededLibs.size(), false);
newRPath = "";
@@ -1143,7 +1139,7 @@ void ElfFile<ElfFileParamNames>::modifyRPath(RPathOp op, vector<string> allowedR
bool libFound = false;
for (unsigned int j = 0; j < neededLibs.size(); ++j)
if (!neededLibFound[j]) {
- string libName = dirName + "/" + neededLibs[j];
+ std::string libName = dirName + "/" + neededLibs[j];
struct stat st;
if (stat(libName.c_str(), &st) == 0) {
neededLibFound[j] = true;
@@ -1182,7 +1178,7 @@ void ElfFile<ElfFileParamNames>::modifyRPath(RPathOp op, vector<string> allowedR
}
- if (string(rpath ? rpath : "") == newRPath) return;
+ if (std::string(rpath ? rpath : "") == newRPath) return;
changed = true;
@@ -1214,7 +1210,7 @@ void ElfFile<ElfFileParamNames>::modifyRPath(RPathOp op, vector<string> allowedR
/* Grow the .dynstr section to make room for the new RPATH. */
debug("rpath is too long, resizing...\n");
- string & newDynStr = replaceSection(".dynstr",
+ std::string & newDynStr = replaceSection(".dynstr",
rdi(shdrDynStr.sh_size) + newRPath.size() + 1);
setSubstr(newDynStr, rdi(shdrDynStr.sh_size), newRPath + '\0');
@@ -1227,7 +1223,7 @@ void ElfFile<ElfFileParamNames>::modifyRPath(RPathOp op, vector<string> allowedR
else {
/* There is no DT_RUNPATH entry in the .dynamic section, so we
have to grow the .dynamic section. */
- string & newDynamic = replaceSection(".dynamic",
+ std::string & newDynamic = replaceSection(".dynamic",
rdi(shdrDynamic.sh_size) + sizeof(Elf_Dyn));
unsigned int idx = 0;
@@ -1236,19 +1232,19 @@ void ElfFile<ElfFileParamNames>::modifyRPath(RPathOp op, vector<string> allowedR
/* Shift all entries down by one. */
setSubstr(newDynamic, sizeof(Elf_Dyn),
- string(newDynamic, 0, sizeof(Elf_Dyn) * (idx + 1)));
+ std::string(newDynamic, 0, sizeof(Elf_Dyn) * (idx + 1)));
/* Add the DT_RUNPATH entry at the top. */
Elf_Dyn newDyn;
wri(newDyn.d_tag, forceRPath ? DT_RPATH : DT_RUNPATH);
newDyn.d_un.d_val = shdrDynStr.sh_size;
- setSubstr(newDynamic, 0, string((char *) &newDyn, sizeof(Elf_Dyn)));
+ setSubstr(newDynamic, 0, std::string((char *) &newDyn, sizeof(Elf_Dyn)));
}
}
template<ElfFileParams>
-void ElfFile<ElfFileParamNames>::removeNeeded(set<string> libs)
+void ElfFile<ElfFileParamNames>::removeNeeded(const std::set<std::string> & libs)
{
if (libs.empty()) return;
@@ -1276,7 +1272,7 @@ void ElfFile<ElfFileParamNames>::removeNeeded(set<string> libs)
}
template<ElfFileParams>
-void ElfFile<ElfFileParamNames>::replaceNeeded(map<string, string>& libs)
+void ElfFile<ElfFileParamNames>::replaceNeeded(const std::map<std::string, std::string> & libs)
{
if (libs.empty()) return;
@@ -1293,8 +1289,9 @@ void ElfFile<ElfFileParamNames>::replaceNeeded(map<string, string>& libs)
for ( ; rdi(dyn->d_tag) != DT_NULL; dyn++) {
if (rdi(dyn->d_tag) == DT_NEEDED) {
char * name = strTab + rdi(dyn->d_un.d_val);
- if (libs.find(name) != libs.end()) {
- const string & replacement = libs[name];
+ auto i = libs.find(name);
+ if (i != libs.end()) {
+ auto replacement = i->second;
debug("replacing DT_NEEDED entry '%s' with '%s'\n", name, replacement.c_str());
@@ -1302,7 +1299,7 @@ void ElfFile<ElfFileParamNames>::replaceNeeded(map<string, string>& libs)
// we'll therefore add a new string
debug("resizing .dynstr ...\n");
- string & newDynStr = replaceSection(".dynstr",
+ std::string & newDynStr = replaceSection(".dynstr",
rdi(shdrDynStr.sh_size) + replacement.size() + 1 + dynStrAddedBytes);
setSubstr(newDynStr, rdi(shdrDynStr.sh_size) + dynStrAddedBytes, replacement + '\0');
@@ -1335,7 +1332,7 @@ void ElfFile<ElfFileParamNames>::replaceNeeded(map<string, string>& libs)
char * verStrTab = (char *) contents + rdi(shdrVersionRStrings.sh_offset);
// and we also need the name of the section containing the strings, so
// that we can pass it to replaceSection
- string versionRStringsSName = getSectionName(shdrVersionRStrings);
+ std::string versionRStringsSName = getSectionName(shdrVersionRStrings);
debug("found .gnu.version_r with %i entries, strings in %s\n", verNeedNum, versionRStringsSName.c_str());
@@ -1344,13 +1341,14 @@ void ElfFile<ElfFileParamNames>::replaceNeeded(map<string, string>& libs)
Elf_Verneed * need = (Elf_Verneed *) (contents + rdi(shdrVersionR.sh_offset));
while (verNeedNum > 0) {
char * file = verStrTab + rdi(need->vn_file);
- if (libs.find(file) != libs.end()) {
- const string & replacement = libs[file];
+ auto i = libs.find(file);
+ if (i != libs.end()) {
+ auto replacement = i->second;
debug("replacing .gnu.version_r entry '%s' with '%s'\n", file, replacement.c_str());
debug("resizing string section %s ...\n", versionRStringsSName.c_str());
- string & newVerDynStr = replaceSection(versionRStringsSName,
+ std::string & newVerDynStr = replaceSection(versionRStringsSName,
rdi(shdrVersionRStrings.sh_size) + replacement.size() + 1 + verStrAddedBytes);
setSubstr(newVerDynStr, rdi(shdrVersionRStrings.sh_size) + verStrAddedBytes, replacement + '\0');
@@ -1370,7 +1368,7 @@ void ElfFile<ElfFileParamNames>::replaceNeeded(map<string, string>& libs)
}
template<ElfFileParams>
-void ElfFile<ElfFileParamNames>::addNeeded(set<string> libs)
+void ElfFile<ElfFileParamNames>::addNeeded(const std::set<std::string> & libs)
{
if (libs.empty()) return;
@@ -1379,22 +1377,20 @@ void ElfFile<ElfFileParamNames>::addNeeded(set<string> libs)
/* add all new libs to the dynstr string table */
unsigned int length = 0;
- for (set<string>::iterator it = libs.begin(); it != libs.end(); it++) {
- length += it->size() + 1;
- }
+ for (auto & i : libs) length += i.size() + 1;
- string & newDynStr = replaceSection(".dynstr",
+ std::string & newDynStr = replaceSection(".dynstr",
rdi(shdrDynStr.sh_size) + length + 1);
- set<Elf64_Xword> libStrings;
+ std::set<Elf64_Xword> libStrings;
unsigned int pos = 0;
- for (set<string>::iterator it = libs.begin(); it != libs.end(); it++) {
- setSubstr(newDynStr, rdi(shdrDynStr.sh_size) + pos, *it + '\0');
+ for (auto & i : libs) {
+ setSubstr(newDynStr, rdi(shdrDynStr.sh_size) + pos, i + '\0');
libStrings.insert(rdi(shdrDynStr.sh_size) + pos);
- pos += it->size() + 1;
+ pos += i.size() + 1;
}
/* add all new needed entries to the dynamic section */
- string & newDynamic = replaceSection(".dynamic",
+ std::string & newDynamic = replaceSection(".dynamic",
rdi(shdrDynamic.sh_size) + sizeof(Elf_Dyn) * libs.size());
unsigned int idx = 0;
@@ -1403,15 +1399,15 @@ void ElfFile<ElfFileParamNames>::addNeeded(set<string> libs)
/* Shift all entries down by the number of new entries. */
setSubstr(newDynamic, sizeof(Elf_Dyn) * libs.size(),
- string(newDynamic, 0, sizeof(Elf_Dyn) * (idx + 1)));
+ std::string(newDynamic, 0, sizeof(Elf_Dyn) * (idx + 1)));
/* Add the DT_NEEDED entries at the top. */
unsigned int i = 0;
- for (set<Elf64_Xword>::iterator it = libStrings.begin(); it != libStrings.end(); it++, i++) {
+ for (auto & j : libStrings) {
Elf_Dyn newDyn;
wri(newDyn.d_tag, DT_NEEDED);
- wri(newDyn.d_un.d_val, *it);
- setSubstr(newDynamic, i * sizeof(Elf_Dyn), string((char *) &newDyn, sizeof(Elf_Dyn)));
+ wri(newDyn.d_un.d_val, j);
+ setSubstr(newDynamic, i * sizeof(Elf_Dyn), std::string((char *) &newDyn, sizeof(Elf_Dyn)));
}
changed = true;
@@ -1453,7 +1449,7 @@ void ElfFile<ElfFileParamNames>::noDefaultLib()
return;
dynFlags1->d_un.d_val |= DF_1_NODEFLIB;
} else {
- string & newDynamic = replaceSection(".dynamic",
+ std::string & newDynamic = replaceSection(".dynamic",
rdi(shdrDynamic.sh_size) + sizeof(Elf_Dyn));
unsigned int idx = 0;
@@ -1462,13 +1458,13 @@ void ElfFile<ElfFileParamNames>::noDefaultLib()
/* Shift all entries down by one. */
setSubstr(newDynamic, sizeof(Elf_Dyn),
- string(newDynamic, 0, sizeof(Elf_Dyn) * (idx + 1)));
+ std::string(newDynamic, 0, sizeof(Elf_Dyn) * (idx + 1)));
/* Add the DT_FLAGS_1 entry at the top. */
Elf_Dyn newDyn;
wri(newDyn.d_tag, DT_FLAGS_1);
newDyn.d_un.d_val = DF_1_NODEFLIB;
- setSubstr(newDynamic, 0, string((char *) &newDyn, sizeof(Elf_Dyn)));
+ setSubstr(newDynamic, 0, std::string((char *) &newDyn, sizeof(Elf_Dyn)));
}
changed = true;
@@ -1478,17 +1474,17 @@ void ElfFile<ElfFileParamNames>::noDefaultLib()
static bool printInterpreter = false;
static bool printSoname = false;
static bool setSoname = false;
-static string newSoname;
-static string newInterpreter;
+static std::string newSoname;
+static std::string newInterpreter;
static bool shrinkRPath = false;
-static vector<string> allowedRpathPrefixes;
+static std::vector<std::string> allowedRpathPrefixes;
static bool removeRPath = false;
static bool setRPath = false;
static bool printRPath = false;
-static string newRPath;
-static set<string> neededLibsToRemove;
-static map<string, string> neededLibsToReplace;
-static set<string> neededLibsToAdd;
+static std::string newRPath;
+static std::set<std::string> neededLibsToRemove;
+static std::map<std::string, std::string> neededLibsToReplace;
+static std::set<std::string> neededLibsToAdd;
static bool printNeeded = false;
static bool noDefaultLib = false;
@@ -1508,14 +1504,14 @@ static void patchElf2(ElfFile & elfFile)
elfFile.setInterpreter(newInterpreter);
if (printRPath)
- elfFile.modifyRPath(elfFile.rpPrint, vector<string>(), "");
+ elfFile.modifyRPath(elfFile.rpPrint, {}, "");
if (shrinkRPath)
elfFile.modifyRPath(elfFile.rpShrink, allowedRpathPrefixes, "");
else if (removeRPath)
- elfFile.modifyRPath(elfFile.rpRemove, vector<string>(), "");
+ elfFile.modifyRPath(elfFile.rpRemove, {}, "");
else if (setRPath)
- elfFile.modifyRPath(elfFile.rpSet, vector<string>(), newRPath);
+ elfFile.modifyRPath(elfFile.rpSet, {}, newRPath);
if (printNeeded) elfFile.printNeededLibs();
@@ -1568,7 +1564,7 @@ static void patchElf()
}
-void showHelp(const string & progName)
+void showHelp(const std::string & progName)
{
fprintf(stderr, "syntax: %s\n\
[--set-interpreter FILENAME]\n\
@@ -1604,7 +1600,7 @@ int main(int argc, char * * argv)
int i;
for (i = 1; i < argc; ++i) {
- string arg(argv[i]);
+ std::string arg(argv[i]);
if (arg == "--set-interpreter" || arg == "--interpreter") {
if (++i == argc) error("missing argument");
newInterpreter = argv[i];