mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Fix linking for libraries with underscores.
This commit is contained in:
parent
b5d941d3d9
commit
a787e70594
@ -38,6 +38,7 @@ Bugfixes:
|
|||||||
|
|
||||||
* JSON AST: nodes were added at wrong parent
|
* JSON AST: nodes were added at wrong parent
|
||||||
* Why3 translator: crash fix for exponentiation
|
* Why3 translator: crash fix for exponentiation
|
||||||
|
* Commandline Interface: linking libraries with underscores in their name.
|
||||||
* Type Checker: Fallback function cannot return data anymore.
|
* Type Checker: Fallback function cannot return data anymore.
|
||||||
|
|
||||||
Lots of changes to the documentation mainly by voluntary external contributors.
|
Lots of changes to the documentation mainly by voluntary external contributors.
|
||||||
|
@ -778,37 +778,38 @@ void CommandLineInterface::actOnInput()
|
|||||||
|
|
||||||
bool CommandLineInterface::link()
|
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)
|
for (auto& src: m_sourceCodes)
|
||||||
{
|
{
|
||||||
auto end = src.second.end();
|
auto end = src.second.end();
|
||||||
for (auto it = src.second.begin(); it != end;)
|
for (auto it = src.second.begin(); it != end;)
|
||||||
{
|
{
|
||||||
while (it != end && *it != '_') ++it;
|
while (it != end && *it != '_') ++it;
|
||||||
auto insertStart = it;
|
if (it == end) break;
|
||||||
while (it != end && *it == '_') ++it;
|
if (end - it < 40)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
string name(nameStart, nameEnd);
|
string name(it, it + 40);
|
||||||
if (m_libraries.count(name))
|
if (librariesReplacements.count(name))
|
||||||
{
|
{
|
||||||
string hexStr(toHex(m_libraries.at(name).asBytes()));
|
string hexStr(toHex(librariesReplacements.at(name).asBytes()));
|
||||||
copy(hexStr.begin(), hexStr.end(), insertStart);
|
copy(hexStr.begin(), hexStr.end(), it);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
cerr << "Reference \"" << name << "\" in file \"" << src.first << "\" still unresolved." << endl;
|
cerr << "Reference \"" << name << "\" in file \"" << src.first << "\" still unresolved." << endl;
|
||||||
|
it += 40;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
Loading…
Reference in New Issue
Block a user