提交 8ea3bcda 编写于 作者: Y yinchuang

Optimize linker memory by reduce struct size

Issue:I6SL6I
Signed-off-by: Nyinchuang <yinchuang@huawei.com>
上级 c8802e86
......@@ -77,6 +77,7 @@ static void error(const char *, ...);
#define PARENTS_BASE_CAPACITY 8
#define RELOC_CAN_SEARCH_DSO_BASE_CAPACITY 32
#define ANON_NAME_MAX_LEN 70
struct debug {
int ver;
......@@ -174,6 +175,10 @@ static void handle_relro_sharing(struct dso *p, const dl_extinfo *extinfo, ssize
/* asan path open */
int handle_asan_path_open(int fd, const char *name, ns_t *namespace, char *buf, size_t buf_size);
static void set_bss_vma_name(char *path_name, void *addr, size_t zeromap_size);
static void find_and_set_bss_name(struct dso *p);
/* add namespace function */
static void get_sys_path(ns_configor *conf);
static void dlclose_ns(struct dso *p);
......@@ -1438,9 +1443,11 @@ static void *map_library(int fd, struct dso *dso, struct reserved_address_params
if (ph->p_memsz > ph->p_filesz && (ph->p_flags&PF_W)) {
size_t brk = (size_t)base+ph->p_vaddr+ph->p_filesz;
size_t pgbrk = brk+PAGE_SIZE-1 & -PAGE_SIZE;
size_t zeromap_size = (size_t)base+this_max-pgbrk;
memset((void *)brk, 0, pgbrk-brk & PAGE_SIZE-1);
if (pgbrk-(size_t)base < this_max && mmap_fixed((void *)pgbrk, (size_t)base+this_max-pgbrk, prot, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) == MAP_FAILED)
if (pgbrk-(size_t)base < this_max && mmap_fixed((void *)pgbrk, zeromap_size, prot, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) == MAP_FAILED)
goto error;
set_bss_vma_name(dso->name, (void *)pgbrk, zeromap_size);
}
}
for (i=0; ((size_t *)(base+dyn))[i]; i+=2)
......@@ -2797,6 +2804,9 @@ void __dls3(size_t *sp, size_t *auxv)
reclaim_gaps(&app);
reclaim_gaps(&ldso);
find_and_set_bss_name(&app);
find_and_set_bss_name(&ldso);
/* Load preload/needed libraries, add symbols to global namespace. */
ldso.deps = (struct dso **)no_deps;
/* Init g_is_asan */
......@@ -4506,10 +4516,11 @@ static bool task_map_library(struct loadtask *task, struct reserved_address_para
if (ph->p_memsz > ph->p_filesz && (ph->p_flags & PF_W)) {
size_t brk = (size_t)base + ph->p_vaddr + ph->p_filesz;
size_t pgbrk = brk + PAGE_SIZE - 1 & -PAGE_SIZE;
size_t zeromap_size = (size_t)base + this_max - pgbrk;
memset((void *)brk, 0, pgbrk - brk & PAGE_SIZE - 1);
if (pgbrk - (size_t)base < this_max && mmap_fixed(
(void *)pgbrk,
(size_t)base + this_max - pgbrk,
zeromap_size,
prot,
MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS,
-1,
......@@ -4517,6 +4528,7 @@ static bool task_map_library(struct loadtask *task, struct reserved_address_para
LD_LOGE("Error mapping library: mmap fix failed");
goto error;
}
set_bss_vma_name(task->p->name, (void *)pgbrk, zeromap_size);
}
}
for (i = 0; ((size_t *)(base + task->dyn))[i]; i += NEXT_DYNAMIC_INDEX) {
......@@ -5130,3 +5142,36 @@ static void handle_relro_sharing(struct dso *p, const dl_extinfo *extinfo, ssize
}
}
}
static void set_bss_vma_name(char *path_name, void *addr, size_t zeromap_size)
{
char so_bss_name[ANON_NAME_MAX_LEN];
if (path_name == NULL) {
snprintf(so_bss_name, ANON_NAME_MAX_LEN, ".bss");
} else {
char *t = strrchr(path_name, '/');
if (t) {
snprintf(so_bss_name, ANON_NAME_MAX_LEN, "%s.bss", ++t);
} else {
snprintf(so_bss_name, ANON_NAME_MAX_LEN, "%s.bss", path_name);
}
}
prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, addr, zeromap_size, so_bss_name);
}
static void find_and_set_bss_name(struct dso *p)
{
size_t cnt;
Phdr *ph = p->phdr;
for (cnt = p->phnum; cnt--; ph = (void *)((char *)ph + p->phentsize)) {
if (ph->p_type != PT_LOAD) continue;
size_t seg_start = p->base + ph->p_vaddr;
size_t seg_file_end = seg_start + ph->p_filesz + PAGE_SIZE - 1 & -PAGE_SIZE;
size_t seg_max_addr = seg_start + ph->p_memsz + PAGE_SIZE - 1 & -PAGE_SIZE;
size_t zeromap_size = seg_max_addr - seg_file_end;
if (zeromap_size > 0 && (ph->p_flags & PF_W)) {
set_bss_vma_name(p->name, (void *)seg_file_end, zeromap_size);
}
}
}
......@@ -21,14 +21,15 @@ extern "C" {
#endif
#include <stdbool.h>
#include <stdint.h>
#include "strops.h"
#define NS_DEFAULT_NAME "default"
struct dso;
/* define dso list */
typedef struct _dso_list_ {
size_t num;
size_t size;
uint16_t num;
uint16_t size;
struct dso **dsos;
} dsolist;
/* define namespace struct */
......@@ -49,8 +50,8 @@ typedef struct _namespace_t_ {
} ns_t;
/* define namespace list */
typedef struct _namespaces_list_ {
size_t num;
size_t size;
uint16_t num;
uint16_t size;
ns_t **nss;
} nslist;
/* define namespace inherit */
......@@ -60,8 +61,8 @@ typedef struct _namespace_inherit_ {
} ns_inherit;
/* define namespace inherit list */
typedef struct _ns_inherit_list_ {
size_t num;
size_t size;
uint16_t num;
uint16_t size;
ns_inherit **inherits;
} ns_inherit_list;
......
......@@ -86,13 +86,9 @@ struct dso {
struct dso *next, *prev;
/* add namespace */
ns_t *namespace;
/* mark the dso status */
unsigned int flags;
int cache_sym_index;
struct dso *cache_dso;
Sym *cache_sym;
Phdr *phdr;
int phnum;
size_t phentsize;
......@@ -110,18 +106,7 @@ struct dso {
dev_t dev;
ino_t ino;
uint64_t file_offset;
char relocated;
char constructed;
char kernel_mapped;
char mark;
char bfs_built;
char runtime_loaded;
char by_dlopen;
struct dso **deps, *needed_by;
size_t ndeps_direct;
size_t next_dep;
int ctor_visitor;
int nr_dlopen;
char *rpath_orig, *rpath;
struct tls_module tls;
size_t tls_id;
......@@ -141,14 +126,27 @@ struct dso {
size_t *got;
} *funcdescs;
size_t *got;
struct dso **deps, *needed_by;
uint16_t ndeps_direct;
uint16_t next_dep;
uint16_t parents_count;
uint16_t parents_capacity;
struct dso **parents;
size_t parents_count;
size_t parents_capacity;
struct dso **reloc_can_search_dso_list;
uint16_t reloc_can_search_dso_count;
uint16_t reloc_can_search_dso_capacity;
/* mark the dso status */
uint32_t flags;
uint8_t nr_dlopen;
bool is_global;
bool is_reloc_head_so_dep;
struct dso **reloc_can_search_dso_list;
size_t reloc_can_search_dso_count;
size_t reloc_can_search_dso_capacity;
char relocated;
char constructed;
char kernel_mapped;
char mark;
char bfs_built;
char runtime_loaded;
char by_dlopen;
bool is_mapped_to_shadow;
char buf[];
};
......
......@@ -3,6 +3,7 @@
#include <limits.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/prctl.h>
#include <errno.h>
#include "meta.h"
......@@ -125,6 +126,7 @@ struct meta *alloc_meta(void)
if (brk(new) != new) {
ctx.brk = -1;
} else {
prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, ctx.brk, new - ctx.brk, "heap:meta");
if (need_guard) mmap((void *)ctx.brk, pagesize,
PROT_NONE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0);
ctx.brk = new;
......@@ -313,6 +315,7 @@ static struct meta *alloc_group(int sc, size_t req)
free_meta(m);
return 0;
}
prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, p, needed, "heap:brk");
m->maplen = needed>>12;
ctx.mmap_counter++;
active_idx = (4096-UNIT)/size-1;
......@@ -373,6 +376,7 @@ void *malloc(size_t n)
MAP_PRIVATE|MAP_ANON, -1, 0);
if (p==MAP_FAILED) return 0;
wrlock();
prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, p, needed, "heap:mmap");
step_seq();
g = alloc_meta();
if (!g) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册