Как я понимаю, системные библиотеки, такие как libc, также должны поставляться, потому что исполняемый файл будет аварийно завершаться при другой версии libc.
То есть неверно : GLIBCгарантирует обратную совместимость (исполняемый файл, построенный на более старой системе, продолжит работать на более новых версиях GLIBC).
Единственный разумный способ добиться того, чего вы хотите, - это скомпилировать с самой старой версиейGLIBC, который вы хотите поддерживать.
Между тем libc, похоже, связан с ld-linux
Правильно: libc.so.6
и ld-linux
являются частью GLIBC, должен происходить из той же сборки, и любое несоответствие может привести к катастрофическому отказу (SIGSEGV
внутри libc.so.6
или внутри ld-linux
).
Мне нужно упаковать ld-linux тоже.
Это сложно: абсолютный путь к ld-linux
жестко закодирован в a.out
и не может быть изменен.Сделать перемещаемым a.out
, который может допускать изменения пути к ld-linux
, невозможно (если не считать явного вызова загрузчика, который вы уже пробовали; который плохо работает для исполняемых файлов, которые повторно исполняются сами)).
Обновление:
Я мог бы попытаться использовать старую Ubuntu LTS и получить большую часть обратной совместимости, но тогда я не получил бы новый C++ 17 компиляторов, которые в основном сводят на нет весь смысл современной программной инженерии.
Вы можете установить более новый компилятор на более старой системе и получить C ++ 17 с более старой GLIBC.
Одна трудность в том, что вам может потребоваться более новый libstdc++.so.6
.
Хорошая новость заключается в том, что -Wl,-rpath=$ORIGIN
работает нормально - это только GLIBC, который трудно переместить.Вы также можете связать исполняемый файл с libstdc++.a
с --static-libstdc++
.
Однако при этом могут возникнуть последствия для лицензирования (но с другой стороны, ваш план уже включал распространение всех библиотек, так что проблема не нова).