18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_cistatic int find_map(void **start, void **end, const char *name) 38c2ecf20Sopenharmony_ci{ 48c2ecf20Sopenharmony_ci FILE *maps; 58c2ecf20Sopenharmony_ci char line[128]; 68c2ecf20Sopenharmony_ci int found = 0; 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci maps = fopen("/proc/self/maps", "r"); 98c2ecf20Sopenharmony_ci if (!maps) { 108c2ecf20Sopenharmony_ci fprintf(stderr, "cannot open maps\n"); 118c2ecf20Sopenharmony_ci return -1; 128c2ecf20Sopenharmony_ci } 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci while (!found && fgets(line, sizeof(line), maps)) { 158c2ecf20Sopenharmony_ci int m = -1; 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci /* We care only about private r-x mappings. */ 188c2ecf20Sopenharmony_ci if (2 != sscanf(line, "%p-%p r-xp %*x %*x:%*x %*u %n", 198c2ecf20Sopenharmony_ci start, end, &m)) 208c2ecf20Sopenharmony_ci continue; 218c2ecf20Sopenharmony_ci if (m < 0) 228c2ecf20Sopenharmony_ci continue; 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci if (!strncmp(&line[m], name, strlen(name))) 258c2ecf20Sopenharmony_ci found = 1; 268c2ecf20Sopenharmony_ci } 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci fclose(maps); 298c2ecf20Sopenharmony_ci return !found; 308c2ecf20Sopenharmony_ci} 31