Fix linking for libraries with underscores.

This commit is contained in:
chriseth 2016-09-02 01:16:03 +02:00
parent b5d941d3d9
commit a787e70594
2 changed files with 19 additions and 17 deletions

View File

@ -38,6 +38,7 @@ Bugfixes:
* JSON AST: nodes were added at wrong parent
* Why3 translator: crash fix for exponentiation
* Commandline Interface: linking libraries with underscores in their name.
* Type Checker: Fallback function cannot return data anymore.
Lots of changes to the documentation mainly by voluntary external contributors.

View File

@ -778,37 +778,38 @@ void CommandLineInterface::actOnInput()
bool CommandLineInterface::link()
{
map<string, h160> librariesReplacements;
for (auto const& library: m_libraries)
{
string const& name = library.first;
string replacement = "__";
for (size_t i = 0; i < 36; ++i)
replacement.push_back(i < name.size() ? name[i] : '_');
replacement += "__";
librariesReplacements[replacement] = library.second;
}
for (auto& src: m_sourceCodes)
{
auto end = src.second.end();
for (auto it = src.second.begin(); it != end;)
{
while (it != end && *it != '_') ++it;
auto insertStart = it;
while (it != end && *it == '_') ++it;
auto nameStart = it;
while (it != end && *it != '_') ++it;
auto nameEnd = it;
while (it != end && *it == '_') ++it;
auto insertEnd = it;
if (insertStart == end)
break;
if (insertEnd - insertStart != 40)
if (it == end) break;
if (end - it < 40)
{
cerr << "Error in binary object file " << src.first << " at position " << (insertStart - src.second.begin()) << endl;
cerr << "Error in binary object file " << src.first << " at position " << (end - src.second.begin()) << endl;
return false;
}
string name(nameStart, nameEnd);
if (m_libraries.count(name))
string name(it, it + 40);
if (librariesReplacements.count(name))
{
string hexStr(toHex(m_libraries.at(name).asBytes()));
copy(hexStr.begin(), hexStr.end(), insertStart);
string hexStr(toHex(librariesReplacements.at(name).asBytes()));
copy(hexStr.begin(), hexStr.end(), it);
}
else
cerr << "Reference \"" << name << "\" in file \"" << src.first << "\" still unresolved." << endl;
it += 40;
}
}
return true;