objdump very long run time when using -D -z flags
Fangrui Song
i@maskray.me
Fri May 1 01:22:11 GMT 2020
On Thu, Apr 30, 2020 at 7:26 AM Haim Shimonovich via Binutils
<binutils@sourceware.org> wrote:
>
> Hi,
> This problem occurs when defining a large uninitialized array or section.
> A simple example can recreate this bug:
>
> #include "stdio.h"
> int arr[1000000];
> int main(){
> printf("hello world\n");
> return 0;
> }
>
> I traced the problem to the following highlighted code (objdump.c):
>
> addr_offset = start_offset;
> while (addr_offset < stop_offset)
> {
> bfd_vma z;
> bfd_boolean need_nl = FALSE;
> int previous_octets;
>
> /* Remember the length of the previous instruction. */
> previous_octets = octets;
> octets = 0;
>
> /* Make sure we don't use relocs from previous instructions. */
> aux->reloc = NULL;
>
> /* If we see more than SKIP_ZEROES octets of zeroes, we just
> print `...'. */
> for (z = addr_offset * opb; z < stop_offset * opb; z++)
> if (data[z] != 0)
> break;
>
> I suggest the following fix (performing the loop only when -z is not used):
>
>
> addr_offset = start_offset;
> while (addr_offset < stop_offset)
> {
> bfd_vma z;
> bfd_boolean need_nl = FALSE;
> int previous_octets;
>
> /* Remember the length of the previous instruction. */
> previous_octets = octets;
> octets = 0;
>
> /* Make sure we don't use relocs from previous instructions. */
> aux->reloc = NULL;
>
> /* If we see more than SKIP_ZEROES octets of zeroes, we just
> print `...'. */
> if (! disassemble_zeroes){
> for (z = addr_offset * opb; z < stop_offset * opb; z++)
> if (data[z] != 0)
> break;
> }
>
> I would like to hear any comments regarding my suggestion.
>
> Thanks,
> Haim Shimonovich
>
This just hides the problem. -z is still going to be slow. To avoid
the quadratic behavior, we should increase the address by at least `z`
if we have scanned `z` zeros.
More information about the Binutils
mailing list