Цитата man elf
(но вы можете найти ту же информацию из спецификации ELF):
p_offset: Этот член содержит смещение от начала файла, в котором находится первый байт сегмента.
p_filesz: этот член содержит количество байтов в файловом изображении сегмента. Может быть ноль.
p_memsz: этот член содержит количество байтов в образе памяти сегмента. Может быть ноль.
Подведем итог:
p_offset
- это смещение сегмента в файле ELF;
p_memsz
- размер сегмента в памяти ;
p_filesz
- размер сегмента в файле .
Размер файла может быть меньше, чем размер в памяти p_memsz
: в этом случае оставшаяся часть сегмента заполняется нулями (в POSIX-подобных системах эта часть равна mmap
с использованием MAP_ANONYMOUS
).
Ссылки из GNU ld.so
:
Возможно, вас заинтересует код elfcat (инструмент, который я написал), который выгружает данный сегмент в стандартный вывод.
Вам нужно использовать опцию -name
, чтобы указать, на что проверяется ваше выражение. Для меня работает следующее:
find. -type d ! -name '~*'
Тест имени должен пройти нормально:
find. -type d ! -name '~*'
Чтобы пропустить папки ./path/to/~dir
, но не ./path/to/~dir/subdir
, как уже говорили другие, вы можете сделать:
find. ! -name '~*' -type d -print
Если вы также не хотите спускаться в эти папки (и находить там другие папки ), вы должны:
find. -name '~*' -prune -o -type d -print
Это говорит find
обрезать ветки, находящиеся в каталогах, имя которых начинается с ~
.
Это должно быть в основном¹ функционально эквивалентно вашему:
find. -type d ! -path '*/~*'
За исключением того, что последний не выполняет обрезку, поэтому по-прежнему просматривает эти каталоги, даже если не печатает ни один из них, поэтому он менее эффективен.
¹ есть некоторая разница в том, что первый *
в */~*
может не совпадать с именами файлов, содержащими недопустимые символы