Не используйте этот Boot-repair снова. Вы установили grub для неправильной арки. /boot/grub/i386-pc/core.img
, но ваш grub-entry говорит Linux Mint 17.2 Cinnamon 64-bit, 3.16.0-38-generic
Возьмите носитель, который вы установили в свою систему. Это должен быть тот же Arch. Вам нужно создать /mnt/dev
и /mnt/sys
/mnt/run и
/mnt/proc
/mnt/etc/resolv.conf
в Live-сессии. Следующие шаги
sudo mount /dev/sda5 /mnt
sudo mount --bind /dev /mnt/dev
sudo mount --bind /sys /mnt/sys
sudo mount --bind /proc /mnt/proc
sudo mount --bind /run /mnt/run
sudo mount -o bind /etc/resolv. conf /mnt/etc/resolv.conf
sudo chroot /mnt /bin/bash
Теперь вы находитесь в своей системе. sudo apt-get clean
Чтобы освободить место на жестком диске. df -h;df -i
покажет вам, сколько места и сколько inodes свободно.
Это уничтожает все неправильные grub-пакеты. dpkg -l | grep grub | awk '{print $2}' | xargs sudo apt-get install --reinstall -y
Attantion apt install сразу без всякого запроса.
sudo apt-get install --reinstall linux-image-3.13.0-24-generic linux-image-extra-3.13. 0-24-generic
Учитывая, что программа запоминает, использовать ли библиотеку между запусками, она должна хранить эту информацию где-то в конфигурационном файле. Как предложил Фахим Митха, лучше всего найти этот конфигурационный файл и создать его перед запуском программы.
Запуск программы с помощью strace
должен показать вам, какие файлы она загружает:
strace -o myprogram.strace -e open,access myprogram
Если вам нужно изменить работу программы, то в этой ситуации потребуется LD_PRELOAD
. Вам нужно будет найти, какой вызов библиотеки (не системный вызов!) делает программа, чтобы определить, загружать ли файл. В этом может помочь команда ltrace
. Например, если программа вызывает dlopen
, переопределите функцию dlopen
, чтобы она возвращала ошибку, если программа пытается открыть эту конкретную библиотеку. Предупреждение: непроверенный код.
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int dlopen(const char *filename, int flags) {
int (*original_dlopen)(const char *, int) = dlsym(RTLD_NEXT, "dlopen");
if (!strcmp(filename, PATH_TO_HIDE)) {
return NULL;
}
return original_fopen(path, mode);
}
Скомпилируйте с
gcc -DPATH_TO_HIDE='"libfoo.so"' -O -Wall -fPIC -shared -o hide_libfoo.so hide_library.c -dl
Запустите программу следующим образом:
LD_PRELOAD=./hide_libfoo.so ./myprogram
Вы можете запустить программу в chroot
, что заставит загрузчик использовать только библиотеки, которые вы скопировали в ограниченную среду.
Дополнительная литература: