Dyld mac os что это за папка

Русские Блоги

Роль dyld в процессе запуска приложения

Как упоминалось в предыдущей статье, в процессе запуска приложения ядро ​​операционной системы сначала выполняет некоторую обработку, такую ​​как создание нового процесса и выделение памяти. В iOS / Mac OS ядро ​​операционной системы — XNU. После того, как XNU завершит соответствующую работу, он передаст управление dyld. dyld, динамический компоновщик, используется для загрузки динамических библиотек. dyld работает в пользовательском режиме, от XNU до dyld, завершил переход из режима ядра в пользовательский режим. Итак, что сделал Дилд? К счастью, dyld — это открытый исходный код. Мы анализируем исходный код dyld, чтобы увидеть, какую работу проделал dyld во время запуска приложения.

Dyld Вход

Как упоминалось в предыдущей статье, функция ввода dyld — __dyld_start, давайте посмотрим на те операции, которые выполняются в __dyld_start. Часть исходного кода в dyld — это язык ассемблера, а исходный код __dyld_start — это ассемблер. Часть кода __dyld_start выглядит следующим образом:

__dyld_start внутренне вызывает функцию dyldbootstrap :: start (), взглянем на внутреннюю реализацию dyldbootstrap :: start ():

Операция по нахождению адреса основной функции приложения в основном выполняется в функции _main, а в функции _main выполняется больше операций. Посмотрим, как реализована функция _main ().

функция _main ()

В функции _main () содержится больше кода, и многое еще сделано. В основном завершается создание контекста, основная программа инициализируется в объект ImageLoader, загружается динамическая библиотека общей системы, загружается зависимая динамическая библиотека, связывается динамическая библиотека, инициализируется основная программа и возвращается адрес функции main () основной программы. Далее рассмотрим конкретную реализацию каждой функции в отдельности.

instantiateFromLoadedImage

Функция instantiateFromLoadedImage () в основном преобразует файл Mach-O основной программы в объект ImageLoader, который используется в последующем процессе компоновки. ImageLoader является абстрактным классом, и его родственными классами являются ImageLoaderMachO, ImageLoaderMachO является подклассом ImageLoader, ImageLoaderMachO имеет два подкласса, ImageLoaderMachOCompressed и ImageLoaderMachOClassic. Отношения между этими классами следующие:

В процессе запуска приложения основная программа и связанные с ней динамические библиотеки в конечном итоге преобразуются в объект ImageLoader. Посмотрите на операции, выполненные в instantiateFromLoadedImage.

isCompatibleMachO в основном проверяет, совместимы ли cutype и cpusubtype файла mach-o с текущей системой, а затем вызывает функцию instantiateMainExecutable (), взглянем на реализацию функции instantiateMainExecutable ():

Функция instantiateMainExecutable () вызывает ImageLoaderMachOCompressed :: instantiateMainExecutable () и ImageLoaderMachOClassic :: instantiateMainExecutable () в зависимости от того, был ли сжат файл Mach-O. Все текущие файлы Mach-O сжаты, поэтому мы рассмотрим только реализацию ImageLoaderMachOCompressed :: instantiateMainExecutable.

В результате такой последовательности операций файл Mach-O в конечном итоге преобразуется в сжатый объект ImageLoaderMachOC.

mapSharedCache

mapSharedCache () отвечает за загрузку разделяемой динамической библиотеки в системе в пространство памяти, например, UIKit — это динамическая разделяемая библиотека, которая также является механизмом для обмена динамическими библиотеками между различными приложениями. Общие библиотеки, к которым обращаются разные приложения, в конечном итоге отображаются в одну и ту же физическую память, что позволяет получить общую динамическую библиотеку.

В системе Mac OS общий кэш динамической библиотеки хранится в виде файла в каталоге / var / db / dyld, а программа обновления общего кэша — update_dyld_shared_cache, которая находится в каталоге / usr / bin. update_dyld_shared_cache обычно вызывается, только когда системный установщик устанавливает программное обеспечение и обновляет систему. Далее рассмотрим внутреннюю логику реализации mapSharedCache ().

В mapSharedCache () много кодов, мы рассмотрим только некоторые коды:

В mapSharedCache () вызываются некоторые методы в ядре, и, наконец, фактически выполняется системный вызов. Основная логика mapSharedCache (): сначала определите, была ли общая динамическая библиотека отображена в памяти, и, если она уже существует, вернитесь напрямую, в противном случае откройте файл кэша и отобразите общую динамическую библиотеку в память.

loadInsertedDylib

После сопоставления общей динамической библиотеки с памятью dyld загрузит динамическую библиотеку в переменную среды приложения DYLD_INSERT_LIBRARIES, вызвав функцию loadInsertedDylib (). Вы можете установить переменные окружения в xcode и распечатать переменную окружения DYLD_INSERT_LIBRARIES во время запуска приложения. Вот посмотрите на переменную окружения DYLD_INSERT_LIBRARIES разработанного нами приложения:

Взгляните на логику реализации в loadInsertedDylib:

Функция loadInsertedDylib () в основном вызывает функцию load (), взглянем на реализацию функции load ():

Функция load () является точкой входа для поиска динамической библиотеки. В функции load () для поиска динамической библиотеки будут вызываться loadPhase0, loadPhase1, loadPhase2, loadPhase3, loadPhase4, loadPhase5, loadPhase6. Наконец, в loadPhase6 файл mach-o анализируется и, наконец, преобразуется в объект ImageLoader. Взгляните на логику реализации в loadPhase6:

Функция ImageLoaderMachO :: instantiateFromFile () используется в loadPhase6 для генерации объекта ImageLoader. Реализация ImageLoaderMachO :: instantiateFromFile () аналогична логике реализации instantiateMainExecutable, упомянутой выше. Сжатие, генерировать различные объекты ImageLoader, не слишком много введение здесь.

После того, как основная программа и связанные с ней динамические библиотеки в своих переменных среды конвертированы в объекты ImageLoader, dyld свяжет эти ImageLoaders, и эта ссылка использует собственную функцию link () ImageLoader. Посмотрите на конкретную реализацию кода:

Функция link () в основном выполняет следующую работу:
1. recursiveLoadLibraries рекурсивно загружает все зависимые библиотеки
2. recursiveRebase рекурсивно исправляет базовый адрес себя и зависимых библиотек
3. recursiveBind рекурсивно связывает символы

В процессе рекурсивной загрузки всех зависимых библиотек метод загрузки должен вызывать функцию loadLibrary (), а фактическим последним вызовом является метод load (). После link () адреса основной программы и связанных зависимых библиотек были пересмотрены для достижения цели доступности процесса.

initializeMainExecutable

После выполнения функции link () она вызовет функцию initializeMainExecutable (), которую можно понимать как функцию инициализации. На самом деле, в процессе запуска приложения, помимо того, что dyld выполняет некоторую работу, также есть важная роль, то есть runtime, и runtime, и dyld тесно связаны между собой. Некоторые уведомления обратного вызова Dyld регистрируются во время выполнения.Эти уведомления регистрируются при инициализации среды выполнения. Одно из уведомлений заключается в том, что при загрузке нового изображения будет выполнена функция load-images () во время выполнения. Затем посмотрите на некоторый исходный код во время выполнения и проанализируйте, что делает функция load-images ().

В load_images () сначала вызовите функцию trapare_load_methods (), затем вызовите функцию call_load_methods (). Посмотрите на реализацию parepar_load_methods ():

_getObjc2NonlazyClassList получает список всех классов, а remapClass должен получить указатель, соответствующий классу, а затем вызвать функцию schedule_class_load (), взглянуть на реализацию schedule_class_load:

Анализируя этот код, мы можем узнать, что перед добавлением подкласса в список загрузки, его родительский класс будет загружен в список первым. Вот почему метод + load родительского класса вызывается перед методом + load дочернего класса.

Затем мы рассмотрим реализацию функции call_load_methods ():

Функция call_class_loads () в основном вызывается в call_load_methods, взглянем на реализацию call_class_loads:

Основная логика заключается в том, чтобы найти соответствующий класс из списка loadable_classes для загрузки, а затем найти реализацию @selector (load) и выполнить ее.

getThreadPC

getThreadPC — это метод в ImageLoaderMachO, основная функция которого — получить адрес главной функции приложения, взглянуть на логику его реализации:

Основная логика этой функции заключается в том, чтобы пройти loadCommand, найти инструкцию ‘LC_MAIN’, получить дешевый адрес, на который указывает инструкция, после обработки получить адрес основной функции и вернуть этот адрес в __dyld_start. После сохранения адреса основной функции в регистре в __dyld_start, перейдите к соответствующему адресу и начните выполнение основной функции. На этом этапе процесс запуска приложения официально завершен.

резюме

Выше были представлены ключевые функции в каждом процессе в функции _main, и, наконец, давайте посмотрим на реализацию функции _main:

В этой статье представлен весь процесс от dyld, обрабатывающего основную программу Mach-O, до нахождения адреса основной функции Mach-O основной программы. Следует отметить, что это всего лишь введение в общий процесс.На самом деле, помимо того, что написано в статье, в исходном коде есть много деталей и некоторые знания, которые не представлены. Будь то XNU или dyld, чтение его исходного кода — это огромный проект, который требует постоянного изучения и анализа в будущем.

Источник

Системные папки macOS, которые можно удалить для освобождения места

Когда на Mac заканчивается место, то пользователи первым делом проверяют свою личную папку, чтобы удалить оттуда ненужные файлы. Они могут находиться в Документах, Загрузках, на Рабочем столе и других каталогах. Но бывает так, что эти усилия все равно не дают высвободить достаточно места. А ведь в macOS есть и другие папки, которые занимают довольно много места на диске. Мы рассмотрим несколько вариантов каталогов, которые можно удалить на Mac без ущерба для всей системы.

1. Вложения в почтовых папках

Стандартное приложение Почта хранит в своем кэше все сообщения и вложенные файлы. Это дает возможность работать с ними в автономном режиме и позволяет искать сообщения с помощью программы Spotlight.

Чтобы увидеть, сколько точно места занимает база писем в Почте, откройте Finder и нажмите сочетание клавиш Command (⌘) + Shift (⇧) + G, чтобы открыть окно «Перейти к папке».

и нажмите кнопку Перейти, чтобы напрямую открыть папку приложения Почта.

Затем кликните правой кнопкой мыши на эту папку и выбрать пункт «Свойства». Если окажется, что почты скопилось уже несколько гигабайт, то стоит задуматься об удалении старых писем и больших вложений.

Удаление почтовых вложений

Удаление вложения в письме

Для удаления ненужного вложения из письма, откройте приложение Почта, выберите сообщение с весомым аттачем и перейдите по меню Сообщение → Удалить вложенные файлы.

При совершении такого действия вложения будут удалены не только из самого приложения Почта, но и с почтового сервера.

Создание смарт-ящика, содержащего письма с вложениями

Для массового более удобного удаления вложений в Почте можно создать специальную smart-ящик, задействовав ее при фильтрации писем. Для этого:

1. Откройте приложение Почта и перейдите в меню Ящик → Новый смарт-ящик.

2. Придумайте имя для смарт-ящика, например, «Вложения».

3. В графе «Содержит сообщения, удовлетворяющие» выберите вариант «одному из следующих условий».

4. В выпадающем списке условий выберите «Содержит вложенные файлы».

5. Установите галочки напротив пунктов «Включать сообщения из ящика Корзина» и «Включать сообщения из ящика Отправленные». и нажмите кнопку Ok.

6. На боковой панели в разделе Смарт-ящики появится созданный ящик с фильтром вложенных файлов. Нажмите на него.

7. Выберите сортировку писем «По размеру» и установите галочку рядом с пунктом «Самое большое сообщение сверху».

Теперь отыскать ненужные большие файлы с вложениями и удалить их будет намного проще.

Удаление всех вложений из системной папки

Есть возможность удалить вложения непосредственно из места их расположения на диске. Сами файлы останутся на почтовом сервере, зато на Mac освободится дополнительное место. Чтобы сделать это, надо открыть следующую папку:

/Library/Mail/V6 (в macOS High Sierra папка называется V5).

В ней будут видны каталоги с учетными записями электронной почты. Надо выбрать свой аккаунт и открыть папку с набором случайных символов в названии. В ее каталогах содержится папка Attachments.

Понять алгоритм действий можно с помощью приведенного ниже скриншота.

Просмотр и удаление файлов вручную может занять много времени. Ускорить процедуру можно, если ввести в строку поиска Finder слово Attachments. Затем при помощи смарт-поиска добавить фильтр Системные папки. В результатах поиска появятся все папки с почтовыми вложениями (Attachments).

Теперь можно скопировать их на внешний диск в качестве резервной копии, а потом удалить эти файлы.

Как запретить автоматическую загрузку вложений в приложении Почта

Можно дополнительно сэкономить место на диске, попросив приложение Почта не загружать вложения автоматически. Для этого перейдите в Почта → Настройки → Учетные записи.

На левой панели надо выбрать любую из имеющихся учетных записей и нажать «Свойства учетной записи» на правой панели. В раскрывающемся меню «Загрузка вложений» надо выбрать пункт «Нет».

Эта опция не позволит приложению Почта загружать какие-либо медиа-вложения, включая изображения, PDF-файлы, видео- и аудио-файлы. При активации опции «Недавние» почтовое приложение будет загружать вложения, полученные за последние 15 месяцев.

2. Удаление устаревших резервных копий

iTunes (приложение Finder) создает резервные копии iOS, которые могут занимать довольно много места на Mac. В архив попадают все файлы с телефона, а также менее видимые детали: настройки почты и сети, история звонков, текстовые сообщения, избранные контакты и другие личные настройки, которые трудно восстановить вручную.

Как удалить сохраненные резервные копии iPhone и iPad в Finder на Mac

1. Для удаления старых резервных копий, подключите iPhone или iPad к Mac и откройте Finder.

2. Нажмите на определившееся устройство на боковой панели Finder.

3. В появившемся окне, выберите Управлять резервными копиями.

4. Выберите ненужную резервную копию и нажмите Удалить резервную копию.

Как удалить сохраненные резервные копии iPhone и iPad в iTunes на Mac

Для удаления старых резервных копий откройте программу iTunes и перейдите в раздел «Настройки», в котором выберите вкладку «Устройства».

Выделите старые и ненужные резервные файлы и нажмите «Удалить резервную копию».

Где находится папка с резервными копиями iPhone и iPad на Mac?

Нажмите в Finder сочетание клавиш Command (⌘) + Shift (⇧) + G, чтобы открыть меню «Переход к папке».

и нажмите кнопку Перейти.

Удалите в этой папке старые резервные копии.

3. Удаление старой библиотеки iPhoto

Хотя Apple официально отказалась от поддержки приложения iPhoto, заменив его на Фото, переход от одной программы влечет за собой процесс миграции. При первом запуске Фото в папке Изображения будет осуществлен поиск библиотеки iPhoto.

После завершения процесса миграции на Mac окажется две отдельные библиотеки: старая из iPhoto и новая в Фото. Первая из них более не нужна.

Откройте приложение Фото и проверьте, чтобы вся необходимая информация была в наличии. Теперь можно при необходимости скопировать на внешний жесткий диск библиотеку iPhoto в качестве резервной копии, а потом удалить ее с основного диска. Если библиотека фотографий была большой, то такая мера позволит значительно увеличить объем свободного места на диске.

4. Удаление остатков удаленных приложений

Приложения Mac легко удалять с компьютера, просто помещая их в корзину. Но при этом некоторые файлы на диске все же остаются. Это может быть кэшированный контент, файлы настроек, плагины и прочее. Если приложение уже не используется, то все эти файлы можно безопасно удалить. Но при этом надо знать фактическое местоположение этих приложений. Обычно они находятся в папке «Библиотека».

Большинство настроек находится в одном из следующих мест:

/Library/Preferences или /Library/Preferences

/Library/Application Support/[название приложения или разработчика] или /Library/Application Support/[название приложения или разработчика]

Связанные с кэшем файлы находятся в:

/Library/Caches или /Library/Caches

/Library/Containers/[название приложения]/Data/Library/Caches/[App Name]

/Library/Saved Application State

Файлы в этих местах получают имя, согласно обычным стандартам. В него входит название компании, идентификатор приложения и расширение .plist, имеющее отношение к списку свойств.

Иногда разработчик может придерживаться собственных принципов формирования имени файла, но и их не составит труда найти, если сосредоточиться на названии приложения. Все же ручной поиск этих файлов может оказаться утомительным делом. Тогда стоит обратиться к утилите, которая специализируется на поиске «хвостов» удаленных приложений и их очистке.

AppCleaner

AppCleaner является бесплатной утилитой удаления любого приложения на Mac и связанных с ним данных. Программа удаляет кэшированное содержимое, файлы настроек и любые сопутствующие файлы, устанавливаемые вместе с приложением. Для полного удаления программы на Mac просто перетащите иконку программы в окно AppCleaner.

Кроме того, AppCleaner позволяет открыть полный список установленных приложений или воспользоваться поиском. В этом случае для удаления выбранной программы нажмите кнопку Remove. Обратите внимание, что AppCleaner не будет удалять файлы-хвосты, связанные с удаленными ранее приложениями.

App Cleaner & Uninstaller

Это приложение тоже позволяет полностью удалять приложения из системы. Бесплатная версия App Cleaner & Uninstaller дает возможность не только избавляться от ненужных программ, но и отыскивать файлы от ранее удаленных приложений. Утилита также позволяет узнать общий размер программ и сбрасывать их настройки, возвращая в состояние по умолчанию. В премиум-версии появляется возможность удаления системных расширений, можно отключить LaunchAgents (Агенты Запуска) и удалить остатки системных файлов.

5. Удаление ненужных драйверов принтеров и сканеров

Современные Mac-совместимые принтеры и сканеры не нуждаются в специальных драйверах для выполнения своих базовых функций. Если присутствует старое устройство, не поддерживающее современные технологии, то компьютер автоматически установит нужный драйвер для работы.

Для удаления ненужных драйверов принтера пройдите в Системные настройки → Принтеры и сканеры.

Там в списке выберите устройство для удаления, нажмите «-» и подтвердите удаление нажатием кнопки «Удалить».

Обычно производители принтеров предоставляют утилиту для корректного удаления связанного с устройством приложения.

Перейдите в следующую папку:

В ней можно удалить все оставшиеся файлы принтера или сканера.

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

6. Кэш и лог-файлы

Для macOS является обычным делом использование дискового пространства для своих повседневных операций. Браузер постоянно загружает какую-то информацию, приложения кэшируют контент для лучшей своей производительности, а журналы собирают информацию для последующего устранения возможных проблем. В случае острой необходимости очистки места на диске всегда можно удалить кэши приложений и системы без особенных последствий. Однако такая процедура не должна превратиться в обычный еженедельный ритуал обслуживания Mac. Удаление кэшей и логов приведет к замедлению работы компьютера, к тому же отслеживать и анализировать возникающие проблемы будет уже нельзя.

Лог-файлы

Найти журналы событий можно в следующих папках:

/Libarary/Logs и /Library/Logs

Ваш Mac периодически запускает системные скрипты для сжатия старых файлов или замены их на новые. Чтобы проверить время последнего запуска такой программы обслуживания, введите в Терминале следующую команду:

ls -al /var/log/*out

Для анализа дисков и размеров лог-файлов можно использовать и сторонние приложения, такие как OmniDiskSweeper или DiskWave. В случае, если журналы выросли явно чрезмерно, надо изучить их и удалить.

Довольно часто проблемы в работе macOS и приложений связаны с повреждениями кэша. Но эти файлы глубоко спрятаны, что мешает выявить сбой и устранить его. Зато можно полностью удалить файлы кэша и решить проблему. В этом помогут приложения Onyx или CleanMyMac, которые к тому же умеют удалять и лог-файлы.

Папки macOS, которые лучше не трогать

Когда места на диске становится мало, можно поочередно проверить разные папки и оценить их объем. В случае необходимости некоторые можно безопасно удалить. Просто стоит убедиться, что есть в наличии актуальная резервная копия данных для их возврата в случае проблем.

Иногда на диске обнаруживаются незнакомые и непонятные каталоги, занимающие много места. Но лучше ничего не менять в папках macOS из списка, приведенного в статье.

Источник

Mac OS X Hints
Adblock
detector