Скопируйте файлы таким образом, чтобы отдельные файлы копировались в папку, имеющую имя файла в виде строки в полном имени папки

Дамп ядра — это просто дамп памяти, занимаемой вашими программами. Если вы знаете, где что находится, вы можете просто использовать его.

Вы используете исполняемый файл, потому что он объясняет, где (с точки зрения логических адресов )находятся вещи в памяти, т. е. основной файл.

Если вы используете команду objdump, она создаст дамп метаданных об исполняемом объекте, который вы исследуете. В качестве примера используем исполняемый объект с именем a.out.

objdump -h a.outвыводит только информацию заголовка, вы увидите разделы с именами, например. .data или .bss или .text(есть еще много ). Они сообщают загрузчику ядра, где в объекте могут быть найдены различные разделы и где в адресном пространстве процесса этот раздел должен быть загружен, а для некоторых разделов (, например.data.text ), что следует загрузить. (Раздел.bss не содержит никаких данных в файле, но относится к объему памяти, который необходимо зарезервировать в процессе для неинициализированных данных, он заполнен нулями ).

Структура исполняемого объектного файла соответствует стандарту ELF.

objdump -x a.out-сбрасывает всё

Если исполняемый объект по-прежнему содержит свои таблицы символов (, он не был удален-man stripи вы использовали -gдля создания отладочной генерации для gccпредполагая компиляцию исходного кода c ), вы можете изучить содержимое ядра по именам символов, например. если в исходном коде у вас есть переменная/буфер с именем inputLine , вы можете использовать это имя в gdbдля просмотра его содержимого. т. е. gdbбудет знать смещение от начала сегмента данных, инициализированного вашими программами, где начинается inputLine , и длину этой переменной.

Дополнительная литература Статья 1 , Статья 2 , а также Формат исполняемого файла и ссылки (Спецификация ELF ).


Обновление после комментария @mirabilos ниже.

Но если использовать таблицу символов, как в

$ gdb --batch -s a.out -c core -q -ex "x buf1"

Производит

 0x601060 :    0x72617453

а затем не используя таблицу символов и не просматривая адрес непосредственно в,

$ gdb --batch -c core -q -ex "x 0x601060"

Производит

0x601060:   0x72617453

Я исследовал память напрямую, не используя таблицу символов во второй команде.


Я также вижу, что ответ пользователя @user580082 дополняет объяснение и дает -голосов.

1
30.11.2019, 16:15
1 ответ

В одной команде (строка):

cp Abc.dat W_Abc_w/; cp 123.dat W_123_w/; cp 456.dat W_456_w/

Конечная косая черта не требуется, но является привычкой указывать, что намерение состоит в том, чтобы поместить файл в целевой каталог , а не как новый файл .

Как общий цикл с шаблоном:

for f in ???.dat
do
  [ -d W_"${f%.dat}"_w ] && cp -- "$f" W_"${f%.dat}"_w
done

Это берет каждое имя файла, которое имеет три символа, за которыми следует .dat, и копирует их в каталог с соответствующим именем -, если этот каталог уже существует. Расширение имени файла внутри команды cpудаляет конечный .dat.

Если вас интересует командный -подход к строке, который не использует цикл --, но также перемещает файлы вместо копирует их --, вы можете используйте зш:

autoload zmv
zmv '(???).dat' 'W_$1_w'
3
27.01.2020, 23:22

Теги

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