Я выполнил трассировку простого исполняемого файла, а затем попытался сопоставить записи в /proc/{pid}/maps с вызовами mmap. На ранних этапах выполнения двоичный файл загружает и отображает /etc/ld.so.cache. strace говорит, что это 0x7fa2bc468000, но /proc/{pid}/maps сообщает, что это конец предыдущего блока с /etc/ld.so. кэш фактически отображается позже по адресу 0x7fa2bc485000. В промежутке между 0x7fa2bc468000 0x7fa2bc485000 достаточно места, чтобы вместить запрошенный 116336B. Все остальные mmap соответствуют тому, что сообщает strace. Приходится предполагать, что адреса, по которым сообщается трассировка, верны. Тогда возникает вопрос: почему procfs не сообщает о начале /etc/ld.so.cache, где он на самом деле отображается??
/proc/{ pid}/maps:
Примечание: вывод передается в тривиальный скрипт, который добавляет пробел к предыдущему региону и длинуg каждого региона:
$ sudo cat /proc/21416/maps | gap_len.py
gap len address perms offset dev inode pathname
93973797036032 4096 5577faca6000-5577faca7000 r--p 00000000 fe:01 12724957 /home/sam/code/c/sleep-forever
0 4096 5577faca7000-5577faca8000 r-xp 00001000 fe:01 12724957 /home/sam/code/c/sleep-forever
0 4096 5577faca8000-5577faca9000 r--p 00002000 fe:01 12724957 /home/sam/code/c/sleep-forever
0 4096 5577faca9000-5577facaa000 r--p 00002000 fe:01 12724957 /home/sam/code/c/sleep-forever
0 4096 5577facaa000-5577facab000 rw-p 00003000 fe:01 12724957 /home/sam/code/c/sleep-forever
46363121184768 139264 7fa2bc292000-7fa2bc2b4000 r--p 00000000 fe:01 27002342 /usr/lib/x86_64-linux-gnu/libc-2.31.so
0 1413120 7fa2bc2b4000-7fa2bc40d000 r-xp 00022000 fe:01 27002342 /usr/lib/x86_64-linux-gnu/libc-2.31.so
0 323584 7fa2bc40d000-7fa2bc45c000 r--p 0017b000 fe:01 27002342 /usr/lib/x86_64-linux-gnu/libc-2.31.so
0 16384 7fa2bc45c000-7fa2bc460000 r--p 001c9000 fe:01 27002342 /usr/lib/x86_64-linux-gnu/libc-2.31.so
0 8192 7fa2bc460000-7fa2bc462000 rw-p 001cd000 fe:01 27002342 /usr/lib/x86_64-linux-gnu/libc-2.31.so
0 24576 7fa2bc462000-7fa2bc468000 rw-p 00000000 00:00 0
118784 4096 7fa2bc485000-7fa2bc486000 r--p 00000000 fe:01 27002338 /usr/lib/x86_64-linux-gnu/ld-2.31.so
0 131072 7fa2bc486000-7fa2bc4a6000 r-xp 00001000 fe:01 27002338 /usr/lib/x86_64-linux-gnu/ld-2.31.so
0 32768 7fa2bc4a6000-7fa2bc4ae000 r--p 00021000 fe:01 27002338 /usr/lib/x86_64-linux-gnu/ld-2.31.so
4096 4096 7fa2bc4af000-7fa2bc4b0000 r--p 00029000 fe:01 27002338 /usr/lib/x86_64-linux-gnu/ld-2.31.so
0 4096 7fa2bc4b0000-7fa2bc4b1000 rw-p 0002a000 fe:01 27002338 /usr/lib/x86_64-linux-gnu/ld-2.31.so
0 4096 7fa2bc4b1000-7fa2bc4b2000 rw-p 00000000 00:00 0
390483591168 135168 7ffda6ede000-7ffda6eff000 rw-p 00000000 00:00 0 [stack]
753664 16384 7ffda6fb7000-7ffda6fbb000 r--p 00000000 00:00 0 [vvar]
0 8192 7ffda6fbb000-7ffda6fbd000 r-xp 00000000 00:00 0 [vdso]
след:
$ strace ./sleep-forever
execve("./sleep-forever", ["./sleep-forever"], 0x7ffddc44c8d0 /* 58 vars */) = 0
brk(NULL) = 0x5577fc7d3000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=116336, ...}) = 0
mmap(NULL, 116336, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fa2bc468000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260>\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1901536, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa2bc466000
mmap(NULL, 1914496, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa2bc292000
mmap(0x7fa2bc2b4000, 1413120, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x22000) = 0x7fa2bc2b4000
mmap(0x7fa2bc40d000, 323584, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x17b000) = 0x7fa2bc40d000
mmap(0x7fa2bc45c000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c9000) = 0x7fa2bc45c000
mmap(0x7fa2bc462000, 13952, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fa2bc462000
close(3) = 0
arch_prctl(ARCH_SET_FS, 0x7fa2bc467540) = 0
mprotect(0x7fa2bc45c000, 16384, PROT_READ) = 0
mprotect(0x5577faca9000, 4096, PROT_READ) = 0
mprotect(0x7fa2bc4af000, 4096, PROT_READ) = 0
munmap(0x7fa2bc468000, 116336) = 0
clock_nanosleep(CLOCK_REALTIME, 0, {tv_sec=4294967295, tv_nsec=0},
Программа тестирования:
#include
#include
#include
int main(void) {
printf("Starting. Sleeping forever\n");
const char * x = malloc(1);
sleep(-1);
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... d-so-cache
Несоответствие адресов mmap и /proc/pid/maps для /etc/ld.so.cache ⇐ Linux
-
Anonymous
1736982326
Anonymous
Я выполнил трассировку простого исполняемого файла, а затем попытался сопоставить записи в /proc/{pid}/maps с вызовами mmap. На ранних этапах выполнения двоичный файл загружает и отображает /etc/ld.so.cache. strace говорит, что это 0x7fa2bc468000, но /proc/{pid}/maps сообщает, что это конец предыдущего блока с /etc/ld.so. кэш фактически отображается позже по адресу 0x7fa2bc485000. В промежутке между 0x7fa2bc468000 0x7fa2bc485000 достаточно места, чтобы вместить запрошенный 116336B. Все остальные mmap соответствуют тому, что сообщает strace. Приходится предполагать, что адреса, по которым сообщается трассировка, верны. Тогда возникает вопрос: почему procfs не сообщает о начале /etc/ld.so.cache, где он на самом деле отображается??
[b]/proc/{ pid}/maps:[/b]
Примечание: вывод передается в тривиальный скрипт, который добавляет пробел к предыдущему региону и длинуg каждого региона:
$ sudo cat /proc/21416/maps | gap_len.py
gap len address perms offset dev inode pathname
93973797036032 4096 5577faca6000-5577faca7000 r--p 00000000 fe:01 12724957 /home/sam/code/c/sleep-forever
0 4096 5577faca7000-5577faca8000 r-xp 00001000 fe:01 12724957 /home/sam/code/c/sleep-forever
0 4096 5577faca8000-5577faca9000 r--p 00002000 fe:01 12724957 /home/sam/code/c/sleep-forever
0 4096 5577faca9000-5577facaa000 r--p 00002000 fe:01 12724957 /home/sam/code/c/sleep-forever
0 4096 5577facaa000-5577facab000 rw-p 00003000 fe:01 12724957 /home/sam/code/c/sleep-forever
46363121184768 139264 7fa2bc292000-7fa2bc2b4000 r--p 00000000 fe:01 27002342 /usr/lib/x86_64-linux-gnu/libc-2.31.so
0 1413120 7fa2bc2b4000-7fa2bc40d000 r-xp 00022000 fe:01 27002342 /usr/lib/x86_64-linux-gnu/libc-2.31.so
0 323584 7fa2bc40d000-7fa2bc45c000 r--p 0017b000 fe:01 27002342 /usr/lib/x86_64-linux-gnu/libc-2.31.so
0 16384 7fa2bc45c000-7fa2bc460000 r--p 001c9000 fe:01 27002342 /usr/lib/x86_64-linux-gnu/libc-2.31.so
0 8192 7fa2bc460000-7fa2bc462000 rw-p 001cd000 fe:01 27002342 /usr/lib/x86_64-linux-gnu/libc-2.31.so
0 24576 7fa2bc462000-7fa2bc468000 rw-p 00000000 00:00 0
118784 4096 7fa2bc485000-7fa2bc486000 r--p 00000000 fe:01 27002338 /usr/lib/x86_64-linux-gnu/ld-2.31.so
0 131072 7fa2bc486000-7fa2bc4a6000 r-xp 00001000 fe:01 27002338 /usr/lib/x86_64-linux-gnu/ld-2.31.so
0 32768 7fa2bc4a6000-7fa2bc4ae000 r--p 00021000 fe:01 27002338 /usr/lib/x86_64-linux-gnu/ld-2.31.so
4096 4096 7fa2bc4af000-7fa2bc4b0000 r--p 00029000 fe:01 27002338 /usr/lib/x86_64-linux-gnu/ld-2.31.so
0 4096 7fa2bc4b0000-7fa2bc4b1000 rw-p 0002a000 fe:01 27002338 /usr/lib/x86_64-linux-gnu/ld-2.31.so
0 4096 7fa2bc4b1000-7fa2bc4b2000 rw-p 00000000 00:00 0
390483591168 135168 7ffda6ede000-7ffda6eff000 rw-p 00000000 00:00 0 [stack]
753664 16384 7ffda6fb7000-7ffda6fbb000 r--p 00000000 00:00 0 [vvar]
0 8192 7ffda6fbb000-7ffda6fbd000 r-xp 00000000 00:00 0 [vdso]
[b]след:[/b]
$ strace ./sleep-forever
execve("./sleep-forever", ["./sleep-forever"], 0x7ffddc44c8d0 /* 58 vars */) = 0
brk(NULL) = 0x5577fc7d3000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=116336, ...}) = 0
mmap(NULL, 116336, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fa2bc468000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260>\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1901536, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa2bc466000
mmap(NULL, 1914496, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa2bc292000
mmap(0x7fa2bc2b4000, 1413120, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x22000) = 0x7fa2bc2b4000
mmap(0x7fa2bc40d000, 323584, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x17b000) = 0x7fa2bc40d000
mmap(0x7fa2bc45c000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c9000) = 0x7fa2bc45c000
mmap(0x7fa2bc462000, 13952, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fa2bc462000
close(3) = 0
arch_prctl(ARCH_SET_FS, 0x7fa2bc467540) = 0
mprotect(0x7fa2bc45c000, 16384, PROT_READ) = 0
mprotect(0x5577faca9000, 4096, PROT_READ) = 0
mprotect(0x7fa2bc4af000, 4096, PROT_READ) = 0
munmap(0x7fa2bc468000, 116336) = 0
clock_nanosleep(CLOCK_REALTIME, 0, {tv_sec=4294967295, tv_nsec=0},
[b]Программа тестирования:[/b]
#include
#include
#include
int main(void) {
printf("Starting. Sleeping forever\n");
const char * x = malloc(1);
sleep(-1);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79359955/mmap-vs-proc-pid-maps-address-discrepency-for-etc-ld-so-cache[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия