[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Bug binutils/17677] New: _bfd_elf_get_synthetic_symtab runs in O(n^2) c
From: |
tohava at gmail dot com |
Subject: |
[Bug binutils/17677] New: _bfd_elf_get_synthetic_symtab runs in O(n^2) complexity after commit 5840bf271c87c3fc14739173fdc91c6a14057130 |
Date: |
Wed, 03 Dec 2014 19:16:53 +0000 |
https://sourceware.org/bugzilla/show_bug.cgi?id=17677
Bug ID: 17677
Summary: _bfd_elf_get_synthetic_symtab runs in O(n^2)
complexity after commit
5840bf271c87c3fc14739173fdc91c6a14057130
Product: binutils
Version: 2.24
Status: NEW
Severity: normal
Priority: P2
Component: binutils
Assignee: unassigned at sourceware dot org
Reporter: tohava at gmail dot com
This bug was also reported here:
https://bugs.launchpad.net/ubuntu/+source/gdb/+bug/1388999
This bug causes a major slowdown for shared objects with many symbols (loading
times gone from 1 minute to 15 minutes). One possible fix for this is to
allocate an array of size n (n is the plt size) and fill it with the correct
values via random access, doing only one pass on the binary.
I will illustrate this with pseudo code.
Here is the current algorithm, as implemented in
_bfd_elf_get_synthetic_symtab's second for-loop.
for i = 0 to count
addr = bed->plt_sym_val(i, plt, p); // this function has average linear
complexity
// here addr is processed
I would replace the second for-loop with something like this (inspired by
elf_x86_64_plt_sym_val):
quick_plt_table = malloc(sizeof(bfd_vma) * count);
for i = 0 to count
if type_doesnt_match_backend()
continue
bfd_get_section_contents(abfd,..., reloc_index_raw);
reloc_index = H_GET_32(abfd, reloc_index_raw);
quick_plt_table[reloc_index] = plt->vma + plt_offset;
plt_offset += bed->plt_entry_size;
rel += int_rels_per_ext_rel;
for i = 0 to count
addr = quick_plt[i];
// here addr is processed as done previously
Note that my version runs in linear complexity, and thus takes less time.
--
You are receiving this mail because:
You are on the CC list for the bug.
- [Bug binutils/17677] New: _bfd_elf_get_synthetic_symtab runs in O(n^2) complexity after commit 5840bf271c87c3fc14739173fdc91c6a14057130,
tohava at gmail dot com <=
- [Bug binutils/17677] _bfd_elf_get_synthetic_symtab runs in O(n^2) complexity after commit 5840bf271c87c3fc14739173fdc91c6a14057130, tohava at gmail dot com, 2014/12/03
- [Bug binutils/17677] _bfd_elf_get_synthetic_symtab runs in O(n^2) complexity after commit 5840bf271c87c3fc14739173fdc91c6a14057130, hjl.tools at gmail dot com, 2014/12/03
- [Bug binutils/17677] _bfd_elf_get_synthetic_symtab runs in O(n^2) complexity after commit 5840bf271c87c3fc14739173fdc91c6a14057130, hjl.tools at gmail dot com, 2014/12/03
- [Bug binutils/17677] _bfd_elf_get_synthetic_symtab runs in O(n^2) complexity after commit 5840bf271c87c3fc14739173fdc91c6a14057130, tohava at gmail dot com, 2014/12/04
- [Bug binutils/17677] _bfd_elf_get_synthetic_symtab runs in O(n^2) complexity after commit 5840bf271c87c3fc14739173fdc91c6a14057130, cvs-commit at gcc dot gnu.org, 2014/12/04
- [Bug binutils/17677] _bfd_elf_get_synthetic_symtab runs in O(n^2) complexity after commit 5840bf271c87c3fc14739173fdc91c6a14057130, cvs-commit at gcc dot gnu.org, 2014/12/04
- [Bug binutils/17677] _bfd_elf_get_synthetic_symtab runs in O(n^2) complexity, hjl.tools at gmail dot com, 2014/12/04
- [Bug binutils/17677] _bfd_elf_get_synthetic_symtab runs in O(n^2) complexity, hjl.tools at gmail dot com, 2014/12/04
- [Bug binutils/17677] _bfd_elf_get_synthetic_symtab runs in O(n^2) complexity, hjl.tools at gmail dot com, 2014/12/05
- [Bug binutils/17677] _bfd_elf_get_synthetic_symtab runs in O(n^2) complexity, cvs-commit at gcc dot gnu.org, 2014/12/05