Каждая архитектура определяет «ABI» (двоичный интерфейс приложения), который в основном говорит: «Первый аргумент идет сюда, второй идет сюда, третий идет сюда ... return ценность возвращается сюда ". Вы читаете спецификацию ABI, а затем используете порядок и размер аргументов функции, чтобы определить, в какой регистр они входят.
Вам нужно будет сгенерировать разные сборки для каждой платформы, на которую вы хотите ориентироваться. Но вы можете быть достаточно уверены, что все платформы Linux x86_64 совместимы с двоичными кодами, и так далее для x86, ARM, PowerPC и т. Д. Но есть еще BSD: -)
Вот несколько шпаргалок для x86 и x86_64 (осуществил быстрый поиск в Google)
Но также имейте в виду, что сами номера системных вызовов различаются между платформами , поэтому 'open' на x86_64 равно 3, а на x86 - 5.
{{1 }}
Я проверил, установив одну из переменных. Выполнение этого скрипта дважды:
while read line; do
md5sum=${line%%" "*}
#md5sum=$(echo $line | awk '{print $1}')
echo "SUM: $md5sum FILE:_$file"
done < manifest.Stuph.180620
сначала с
md5sum=${line%%" "*}
и далее с
md5sum=$(echo $line | awk '{print $1}')
где файл "manifest.Stuph.180620" имеет длину 100939 строк (== около 14 МБ )дал следующие результаты:
Первый запуск (с использованием встроенной в bash обработки строк)
real 0m4.750s
user 0m4.174s
sys 0m0.550s
Второй запуск (с использованием конвейера)
real 10m54.255s
user 4m42.257s
sys 7m32.880s
Некоторые (такие как я )скажут, что если скорость имеет значение, то вам все равно не следует возиться с оболочкой, но иногда вы можете захотеть быть более эффективным -независимо от того, в какой среде вы работаете. Используете для работы.
Обратите внимание, что при этом:
while read md5sum filename; do
(...etc...)
даже более эффективен, чем выполнение присваивания переменной, но не до такой степени, чтобы исключить конструкцию подстановки команд/конвейера/awk. Что мне кажется наиболее интересным, так это разница между производительностью сборки bash -и использованием внешних команд. Я буду более усердно изучать и использовать причудливые встроенные вещи!
Да, использование внутренней команды bash позволяет избежать многих системных вызовов. Особенно, когда есть рекурсия.
Другой пример :мы должны использовать *против $ (ls ).
Bash предлагает несколько способов выполнения простых манипуляций со строками (вырезания и замены ). Но не более. Потому что он не для этого создан. В примере :сложно проверить наличие шаблона в строке без внешней команды.
Внешние программы более оптимизированы под свои задачи (cat, sed, grep, awk, cut, sort,...)