aboutsummaryrefslogtreecommitdiff
path: root/bfd/linker.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2024-02-28 14:34:33 -0800
committerH.J. Lu <hjl.tools@gmail.com>2024-04-03 09:11:03 -0700
commitd41b7648558757dbfd0958335dba1406be60fb4f (patch)
tree7e2c9a18524dda7ff7403c4568735770a3035708 /bfd/linker.c
parentc6291d749aece753ae8dcba0a5baff2fe9598541 (diff)
downloadgdb-d41b7648558757dbfd0958335dba1406be60fb4f.zip
gdb-d41b7648558757dbfd0958335dba1406be60fb4f.tar.gz
gdb-d41b7648558757dbfd0958335dba1406be60fb4f.tar.bz2
elf: Don't cache symbol nor relocation tables with mmap
During a "-j 8" LLVM 17 debug build on a machine with 32GB RAM and 16GB swap, ld was killed by kernel because of out of memory: [79437.949336] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/session-9.scope,task=ld,pid=797431,uid=1000 [79437.949349] Out of memory: Killed process 797431 (ld) total-vm:9219600kB, anon-rss:6558156kB, file-rss:1792kB, shmem-rss:0kB, UID:1000 pgtables:17552kB oom_score_adj:0 Don't cache symbol nor relocation tables if they are mapped in. Data to link the 3.5GB clang executable in LLVM 17 debug build on Linux/x86-64 with 32GB RAM is: stdio mmap improvement user 86.73 87.02 -0.3% system 9.55 9.21 3.6% total 100.40 97.66 0.7% maximum set(GB) 17.34 13.14 24% page faults 4047667 3042877 25% and data to link the 275M cc1plus executable in GCC 14 stage 1 build is: user 5.41 5.44 -0.5% system 0.80 0.76 5% total 6.25 6.26 -0.2% maximum set(MB) 1323 968 27% page faults 323451 236371 27% These improve the overall system performance for parallel build by reducing memory usage and page faults. Also rename _bfd_link_keep_memory to _bfd_elf_link_keep_memory. Since the --no-keep-memory linker option causes: https://sourceware.org/bugzilla/show_bug.cgi?id=31458 this is opt-in by each backend. bfd/ * elf32-i386.c (elf_i386_scan_relocs): Remove _bfd_link_keep_memory. * elf64-x86-64.c (elf_x86_64_scan_relocs): Likewise. * elflink.c (_bfd_elf_link_keep_memory): New. (_bfd_elf_link_iterate_on_relocs): Replace _bfd_link_keep_memory with _bfd_elf_link_keep_memory. (elf_link_add_object_symbols): Likewise. (init_reloc_cookie): Likewise. (init_reloc_cookie_rels): Likewise. * libbfd-in.h (_bfd_link_keep_memory): Removed. * linker.c (_bfd_link_keep_memory): Likewise. * libbfd.h: Regenerated.
Diffstat (limited to 'bfd/linker.c')
-rw-r--r--bfd/linker.c35
1 files changed, 0 insertions, 35 deletions
diff --git a/bfd/linker.c b/bfd/linker.c
index 36cca96..eb42a78 100644
--- a/bfd/linker.c
+++ b/bfd/linker.c
@@ -3556,38 +3556,3 @@ _bfd_nolink_bfd_define_start_stop (struct bfd_link_info *info ATTRIBUTE_UNUSED,
{
return (struct bfd_link_hash_entry *) _bfd_ptr_bfd_null_error (sec->owner);
}
-
-/* Return false if linker should avoid caching relocation infomation
- and symbol tables of input files in memory. */
-
-bool
-_bfd_link_keep_memory (struct bfd_link_info * info)
-{
- bfd *abfd;
- bfd_size_type size;
-
- if (!info->keep_memory)
- return false;
-
- if (info->max_cache_size == (bfd_size_type) -1)
- return true;
-
- abfd = info->input_bfds;
- size = info->cache_size;
- do
- {
- if (size >= info->max_cache_size)
- {
- /* Over the limit. Reduce the memory usage. */
- info->keep_memory = false;
- return false;
- }
- if (!abfd)
- break;
- size += abfd->alloc_size;
- abfd = abfd->link.next;
- }
- while (1);
-
- return true;
-}