162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_cistatic int find_map(void **start, void **end, const char *name) 362306a36Sopenharmony_ci{ 462306a36Sopenharmony_ci FILE *maps; 562306a36Sopenharmony_ci char line[128]; 662306a36Sopenharmony_ci int found = 0; 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci maps = fopen("/proc/self/maps", "r"); 962306a36Sopenharmony_ci if (!maps) { 1062306a36Sopenharmony_ci fprintf(stderr, "cannot open maps\n"); 1162306a36Sopenharmony_ci return -1; 1262306a36Sopenharmony_ci } 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci while (!found && fgets(line, sizeof(line), maps)) { 1562306a36Sopenharmony_ci int m = -1; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci /* We care only about private r-x mappings. */ 1862306a36Sopenharmony_ci if (2 != sscanf(line, "%p-%p r-xp %*x %*x:%*x %*u %n", 1962306a36Sopenharmony_ci start, end, &m)) 2062306a36Sopenharmony_ci continue; 2162306a36Sopenharmony_ci if (m < 0) 2262306a36Sopenharmony_ci continue; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci if (!strncmp(&line[m], name, strlen(name))) 2562306a36Sopenharmony_ci found = 1; 2662306a36Sopenharmony_ci } 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci fclose(maps); 2962306a36Sopenharmony_ci return !found; 3062306a36Sopenharmony_ci} 31