Я пытаюсь заменить исходный системный вызов mmap()
на предварительно идентифицированный fd через LD_PRELOAD
, так что процесс, вызывающий его, может читать объект общей памяти, созданный ранее другой процесс с boost::interprocess
. Все идет хорошо, за исключением случаев, когда я, наконец, пытаюсь прочитать память в миллиметрах. В этом случае первый процесс прерывается с ошибкой сегментации. В чем причина? Мне не нужны права на запись для объекта общей памяти.mmap() с LD_PRELOAD и boost :: interprocess не работает
Это код в предварительно загруженной библиотеке:
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) {
static void* (*o_mmap) (void *, size_t, int, int, int, off_t) =
o_mmap = (void*(*)(void *, size_t, int, int, int, off_t)) dlsym(RTLD_NEXT, "mmap");
if (!o_mmap)
std::cout << "mmap() preload failed\n";
if (fd != my_fd)
return (*o_mmap)(start, length, prot, flags, fd, offset);
interprocess::shared_memory_object shm (interprocess::open_only, "obj", interprocess::read_only);
interprocess::mapped_region region(shm, interprocess::read_only, 0, length, start);
std::cout << "mmap() overridden. addr =" << region.get_address() << " length: " << region.get_size() << " start: " << start << "\n";
return region.get_address();
}
код программы, создающей объект разделяемой памяти является:
//Create a shared memory object.
shared_memory_object shm (create_only, "obj", read_write);
//Set size
shm.truncate(1000);
//Map the whole shared memory in this process
mapped_region region(shm, read_write);
//Write all the memory to 1
std::memset(region.get_address(), 1, region.get_size());
код программы (который возвращает ошибку сегментации) попытка считывания общей памяти выше:
int fd = open(my_file, O_RDONLY);
void* addr = mmap(0, 1000, PROT_READ, MAP_SHARED, fd, 0); // Okay
//Check that memory was initialized to 1
char *mem = static_cast<char*>(addr);
for(std::size_t i = 0; i < 1000; ++i)
if(*mem++ != 1) // SEGFAULT!
return 1; //Error checking memory
Можете ли вы показать код вашей замены 'mmap'? В этом может быть что-то не так. –
Я буду как можно скорее. – Martin
Вы уверены, что хотите заменить КАЖДЫЙ одиночный вызов mmap() в своем процессе своей собственной реализацией? Если вы используете трюк LD_PRELOAD, это именно то, что произойдет ... –