Rtld on diet 3.
Stop using strerror(3) in rtld, which brings in msgcat and stdio. Directly access sys_errlist array of errno messages with private rtld_strerror() function. Now, $ size /libexec/ld-elf.so.1 text data bss dec hex filename 96983 2480 8744 108207 1a6af /libexec/ld-elf.so.1 Reviewed by: dim, kan MFC after: 2 weeks
This commit is contained in:
parent
a9e7383c18
commit
6fea10fb9f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=232974
@ -71,20 +71,20 @@ lm_init(char *libmap_override)
|
||||
fd = open(_PATH_LIBMAP_CONF, O_RDONLY);
|
||||
if (fd == -1) {
|
||||
dbg("lm_init: open(\"%s\") failed, %s", _PATH_LIBMAP_CONF,
|
||||
strerror(errno));
|
||||
rtld_strerror(errno));
|
||||
goto override;
|
||||
}
|
||||
if (fstat(fd, &st) == -1) {
|
||||
close(fd);
|
||||
dbg("lm_init: fstat(\"%s\") failed, %s", _PATH_LIBMAP_CONF,
|
||||
strerror(errno));
|
||||
rtld_strerror(errno));
|
||||
goto override;
|
||||
}
|
||||
lm_map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||
if (lm_map == (const char *)MAP_FAILED) {
|
||||
close(fd);
|
||||
dbg("lm_init: mmap(\"%s\") failed, %s", _PATH_LIBMAP_CONF,
|
||||
strerror(errno));
|
||||
rtld_strerror(errno));
|
||||
goto override;
|
||||
}
|
||||
close(fd);
|
||||
|
@ -184,7 +184,7 @@ map_object(int fd, const char *path, const struct stat *sb)
|
||||
MAP_NOCORE, -1, 0);
|
||||
if (mapbase == (caddr_t) -1) {
|
||||
_rtld_error("%s: mmap of entire address space failed: %s",
|
||||
path, strerror(errno));
|
||||
path, rtld_strerror(errno));
|
||||
return NULL;
|
||||
}
|
||||
if (base_addr != NULL && mapbase != base_addr) {
|
||||
@ -204,7 +204,8 @@ map_object(int fd, const char *path, const struct stat *sb)
|
||||
data_flags = convert_flags(segs[i]->p_flags) | MAP_FIXED;
|
||||
if (mmap(data_addr, data_vlimit - data_vaddr, data_prot,
|
||||
data_flags, fd, data_offset) == (caddr_t) -1) {
|
||||
_rtld_error("%s: mmap of data failed: %s", path, strerror(errno));
|
||||
_rtld_error("%s: mmap of data failed: %s", path,
|
||||
rtld_strerror(errno));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -221,7 +222,7 @@ map_object(int fd, const char *path, const struct stat *sb)
|
||||
if ((data_prot & PROT_WRITE) == 0 && -1 ==
|
||||
mprotect(clear_page, PAGE_SIZE, data_prot|PROT_WRITE)) {
|
||||
_rtld_error("%s: mprotect failed: %s", path,
|
||||
strerror(errno));
|
||||
rtld_strerror(errno));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -240,7 +241,7 @@ map_object(int fd, const char *path, const struct stat *sb)
|
||||
if (mmap(bss_addr, bss_vlimit - bss_vaddr, data_prot,
|
||||
data_flags | MAP_ANON, -1, 0) == (caddr_t)-1) {
|
||||
_rtld_error("%s: mmap of bss failed: %s", path,
|
||||
strerror(errno));
|
||||
rtld_strerror(errno));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@ -307,7 +308,7 @@ get_elf_header (int fd, const char *path)
|
||||
ssize_t nbytes;
|
||||
|
||||
if ((nbytes = pread(fd, u.buf, PAGE_SIZE, 0)) == -1) {
|
||||
_rtld_error("%s: read error: %s", path, strerror(errno));
|
||||
_rtld_error("%s: read error: %s", path, rtld_strerror(errno));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -2163,7 +2163,7 @@ relocate_objects(Obj_Entry *first, bool bind_now, Obj_Entry *rtldobj,
|
||||
if (mprotect(obj->mapbase, obj->textsize,
|
||||
PROT_READ|PROT_WRITE|PROT_EXEC) == -1) {
|
||||
_rtld_error("%s: Cannot write-enable text segment: %s",
|
||||
obj->path, strerror(errno));
|
||||
obj->path, rtld_strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@ -2176,7 +2176,7 @@ relocate_objects(Obj_Entry *first, bool bind_now, Obj_Entry *rtldobj,
|
||||
if (mprotect(obj->mapbase, obj->textsize,
|
||||
PROT_READ|PROT_EXEC) == -1) {
|
||||
_rtld_error("%s: Cannot write-protect text segment: %s",
|
||||
obj->path, strerror(errno));
|
||||
obj->path, rtld_strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@ -2196,7 +2196,7 @@ relocate_objects(Obj_Entry *first, bool bind_now, Obj_Entry *rtldobj,
|
||||
if (obj->relro_size > 0) {
|
||||
if (mprotect(obj->relro_page, obj->relro_size, PROT_READ) == -1) {
|
||||
_rtld_error("%s: Cannot enforce relro protection: %s",
|
||||
obj->path, strerror(errno));
|
||||
obj->path, rtld_strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@ -4353,3 +4353,12 @@ __chk_fail(void)
|
||||
_rtld_error("buffer overflow detected; terminated");
|
||||
die();
|
||||
}
|
||||
|
||||
const char *
|
||||
rtld_strerror(int errnum)
|
||||
{
|
||||
|
||||
if (errnum < 0 || errnum >= sys_nerr)
|
||||
return ("Unknown error");
|
||||
return (sys_errlist[errnum]);
|
||||
}
|
||||
|
@ -313,6 +313,7 @@ typedef struct Struct_SymLook {
|
||||
} SymLook;
|
||||
|
||||
extern void _rtld_error(const char *, ...) __printflike(1, 2);
|
||||
extern const char *rtld_strerror(int);
|
||||
extern Obj_Entry *map_object(int, const char *, const struct stat *);
|
||||
extern void *xcalloc(size_t);
|
||||
extern void *xmalloc(size_t);
|
||||
|
Loading…
Reference in New Issue
Block a user