Относительный к исполняемому пути динамический компоновщик / интерпретатор ld-linux

Внутри кода, в котором вы создаете строку, обратная косая черта сначала является символом escape-кода javascript, что означает, что escape-последовательности, такие как \t, \n, \" и т. д., будут переведены в их javascript-аналог (вкладка, новая строка, цитата и т. д.), и это будет сделано частью строки. Double-backslash представляет собой одиночную обратную косую черту в самой собственно строке, поэтому, если вам нужна обратная косая черта в строке, вы сначала избегаете ее.

Итак, когда вы создаете строку, говоря var someString = '(\\s|^)' re действительно делает создание фактической строки со значением (\s|^).

1
задан mariusm 25 February 2019 в 11:23
поделиться

1 ответ

Как я понимаю, системные библиотеки, такие как 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++.

Тем не менее, в этом могут быть и последствия для лицензирования (но опять же ваш план уже включал распространение всех библиотек, так что проблема не нова).

0
ответ дан Employed Russian 25 February 2019 в 11:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: