LD_PRELOAD не так уж и сложен, и вам не нужно быть пользователем root.
Вставьте свою собственную процедуру C, которая вызывается вместо реальный open ()
в библиотеке C. Ваша процедура проверяет, является ли открываемый файл «/tmp/adb.log», и вызывает настоящее открытие с другим именем файла. Вот ваш shim_open.c:
/*
* capture calls to a routine and replace with your code
* gcc -Wall -O2 -fpic -shared -ldl -o shim_open.so shim_open.c
* LD_PRELOAD=/.../shim_open.so cat /tmp/adb.log
*/
#define _FCNTL_H 1 /* hack for open() prototype */
#define _GNU_SOURCE /* needed to get RTLD_NEXT defined in dlfcn.h */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dlfcn.h>
#define OLDNAME "/tmp/adb.log"
#define NEWNAME "/tmp/myadb.log"
int open(const char *pathname, int flags, mode_t mode){
static int (*real_open)(const char *pathname, int flags, mode_t mode) = NULL;
if (!real_open) {
real_open = dlsym(RTLD_NEXT, "open");
char *error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
exit(1);
}
}
if (strcmp(pathname,OLDNAME)==0) pathname = NEWNAME;
fprintf(stderr, "opening: %s\n", pathname);
return real_open(pathname, flags, mode);
}
Скомпилируйте его с помощью gcc -Wall -O2 -fpic -shared -ldl -o shim_open.so shim_open.c
и проверьте его, поместив что-нибудь в / tmp / myadb.log
и работает
LD_PRELOAD = / ... / shim_open.so cat /tmp/adb.log
. Тогда попробуйте LD_PRELOAD на adb.
sed
enfoque:
sed -E '/^#include/ s/<prog1/&\/prog1/' testfile
La salida:
#include <prog1/prog1/foo.h>
#include <prog1/prog1/bar.h>
#include <prog1/prog1/baz.h>
-E
para casos más extensos. El simple actual funcionará incluso sin él.