Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
L
libbacktrace
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
libbacktrace
Commits
aced4e1f
Commit
aced4e1f
authored
Feb 15, 2020
by
Ian Lance Taylor
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
libbacktrace: if debug info large or split, read sections individually
Fixes #29
parent
0f06cda9
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
64 additions
and
0 deletions
+64
-0
elf.c
elf.c
+64
-0
No files found.
elf.c
View file @
aced4e1f
...
@@ -2659,10 +2659,13 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
...
@@ -2659,10 +2659,13 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
uint32_t
debugaltlink_buildid_size
;
uint32_t
debugaltlink_buildid_size
;
off_t
min_offset
;
off_t
min_offset
;
off_t
max_offset
;
off_t
max_offset
;
off_t
debug_size
;
struct
backtrace_view
debug_view
;
struct
backtrace_view
debug_view
;
int
debug_view_valid
;
int
debug_view_valid
;
unsigned
int
using_debug_view
;
unsigned
int
using_debug_view
;
uint16_t
*
zdebug_table
;
uint16_t
*
zdebug_table
;
struct
backtrace_view
split_debug_view
[
DEBUG_MAX
];
unsigned
char
split_debug_view_valid
[
DEBUG_MAX
];
struct
elf_ppc64_opd_data
opd_data
,
*
opd
;
struct
elf_ppc64_opd_data
opd_data
,
*
opd
;
struct
dwarf_sections
dwarf_sections
;
struct
dwarf_sections
dwarf_sections
;
...
@@ -2687,6 +2690,7 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
...
@@ -2687,6 +2690,7 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
debugaltlink_buildid_data
=
NULL
;
debugaltlink_buildid_data
=
NULL
;
debugaltlink_buildid_size
=
0
;
debugaltlink_buildid_size
=
0
;
debug_view_valid
=
0
;
debug_view_valid
=
0
;
memset
(
&
split_debug_view_valid
[
0
],
0
,
sizeof
split_debug_view_valid
);
opd
=
NULL
;
opd
=
NULL
;
if
(
!
backtrace_get_view
(
state
,
descriptor
,
0
,
sizeof
ehdr
,
error_callback
,
if
(
!
backtrace_get_view
(
state
,
descriptor
,
0
,
sizeof
ehdr
,
error_callback
,
...
@@ -3131,6 +3135,7 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
...
@@ -3131,6 +3135,7 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
min_offset
=
0
;
min_offset
=
0
;
max_offset
=
0
;
max_offset
=
0
;
debug_size
=
0
;
for
(
i
=
0
;
i
<
(
int
)
DEBUG_MAX
;
++
i
)
for
(
i
=
0
;
i
<
(
int
)
DEBUG_MAX
;
++
i
)
{
{
off_t
end
;
off_t
end
;
...
@@ -3142,6 +3147,7 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
...
@@ -3142,6 +3147,7 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
end
=
sections
[
i
].
offset
+
sections
[
i
].
size
;
end
=
sections
[
i
].
offset
+
sections
[
i
].
size
;
if
(
end
>
max_offset
)
if
(
end
>
max_offset
)
max_offset
=
end
;
max_offset
=
end
;
debug_size
+=
sections
[
i
].
size
;
}
}
if
(
zsections
[
i
].
size
!=
0
)
if
(
zsections
[
i
].
size
!=
0
)
{
{
...
@@ -3150,6 +3156,7 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
...
@@ -3150,6 +3156,7 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
end
=
zsections
[
i
].
offset
+
zsections
[
i
].
size
;
end
=
zsections
[
i
].
offset
+
zsections
[
i
].
size
;
if
(
end
>
max_offset
)
if
(
end
>
max_offset
)
max_offset
=
end
;
max_offset
=
end
;
debug_size
+=
zsections
[
i
].
size
;
}
}
}
}
if
(
min_offset
==
0
||
max_offset
==
0
)
if
(
min_offset
==
0
||
max_offset
==
0
)
...
@@ -3159,11 +3166,45 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
...
@@ -3159,11 +3166,45 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
return
1
;
return
1
;
}
}
/* If the total debug section size is large, assume that there are
gaps between the sections, and read them individually. */
if
(
max_offset
-
min_offset
<
0x20000000
||
max_offset
-
min_offset
<
debug_size
+
0x10000
)
{
if
(
!
backtrace_get_view
(
state
,
descriptor
,
min_offset
,
if
(
!
backtrace_get_view
(
state
,
descriptor
,
min_offset
,
max_offset
-
min_offset
,
max_offset
-
min_offset
,
error_callback
,
data
,
&
debug_view
))
error_callback
,
data
,
&
debug_view
))
goto
fail
;
goto
fail
;
debug_view_valid
=
1
;
debug_view_valid
=
1
;
}
else
{
memset
(
&
split_debug_view
[
0
],
0
,
sizeof
split_debug_view
);
for
(
i
=
0
;
i
<
(
int
)
DEBUG_MAX
;
++
i
)
{
struct
debug_section_info
*
dsec
;
if
(
sections
[
i
].
size
!=
0
)
dsec
=
&
sections
[
i
];
else
if
(
zsections
[
i
].
size
!=
0
)
dsec
=
&
zsections
[
i
];
else
continue
;
if
(
!
backtrace_get_view
(
state
,
descriptor
,
dsec
->
offset
,
dsec
->
size
,
error_callback
,
data
,
&
split_debug_view
[
i
]))
goto
fail
;
split_debug_view_valid
[
i
]
=
1
;
if
(
sections
[
i
].
size
!=
0
)
sections
[
i
].
data
=
((
const
unsigned
char
*
)
split_debug_view
[
i
].
data
);
else
zsections
[
i
].
data
=
((
const
unsigned
char
*
)
split_debug_view
[
i
].
data
);
}
}
/* We've read all we need from the executable. */
/* We've read all we need from the executable. */
if
(
!
backtrace_close
(
descriptor
,
error_callback
,
data
))
if
(
!
backtrace_close
(
descriptor
,
error_callback
,
data
))
...
@@ -3171,6 +3212,8 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
...
@@ -3171,6 +3212,8 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
descriptor
=
-
1
;
descriptor
=
-
1
;
using_debug_view
=
0
;
using_debug_view
=
0
;
if
(
debug_view_valid
)
{
for
(
i
=
0
;
i
<
(
int
)
DEBUG_MAX
;
++
i
)
for
(
i
=
0
;
i
<
(
int
)
DEBUG_MAX
;
++
i
)
{
{
if
(
sections
[
i
].
size
==
0
)
if
(
sections
[
i
].
size
==
0
)
...
@@ -3188,6 +3231,7 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
...
@@ -3188,6 +3231,7 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
zsections
[
i
].
data
=
((
const
unsigned
char
*
)
debug_view
.
data
zsections
[
i
].
data
=
((
const
unsigned
char
*
)
debug_view
.
data
+
(
zsections
[
i
].
offset
-
min_offset
));
+
(
zsections
[
i
].
offset
-
min_offset
));
}
}
}
/* Uncompress the old format (--compress-debug-sections=zlib-gnu). */
/* Uncompress the old format (--compress-debug-sections=zlib-gnu). */
...
@@ -3218,6 +3262,13 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
...
@@ -3218,6 +3262,13 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
sections
[
i
].
data
=
uncompressed_data
;
sections
[
i
].
data
=
uncompressed_data
;
sections
[
i
].
size
=
uncompressed_size
;
sections
[
i
].
size
=
uncompressed_size
;
sections
[
i
].
compressed
=
0
;
sections
[
i
].
compressed
=
0
;
if
(
split_debug_view_valid
[
i
])
{
backtrace_release_view
(
state
,
&
split_debug_view
[
i
],
error_callback
,
data
);
split_debug_view_valid
[
i
]
=
0
;
}
}
}
}
}
...
@@ -3250,7 +3301,14 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
...
@@ -3250,7 +3301,14 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
sections
[
i
].
size
=
uncompressed_size
;
sections
[
i
].
size
=
uncompressed_size
;
sections
[
i
].
compressed
=
0
;
sections
[
i
].
compressed
=
0
;
if
(
debug_view_valid
)
--
using_debug_view
;
--
using_debug_view
;
else
if
(
split_debug_view_valid
[
i
])
{
backtrace_release_view
(
state
,
&
split_debug_view
[
i
],
error_callback
,
data
);
split_debug_view_valid
[
i
]
=
0
;
}
}
}
if
(
zdebug_table
!=
NULL
)
if
(
zdebug_table
!=
NULL
)
...
@@ -3297,6 +3355,12 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
...
@@ -3297,6 +3355,12 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
backtrace_release_view
(
state
,
&
buildid_view
,
error_callback
,
data
);
backtrace_release_view
(
state
,
&
buildid_view
,
error_callback
,
data
);
if
(
debug_view_valid
)
if
(
debug_view_valid
)
backtrace_release_view
(
state
,
&
debug_view
,
error_callback
,
data
);
backtrace_release_view
(
state
,
&
debug_view
,
error_callback
,
data
);
for
(
i
=
0
;
i
<
(
int
)
DEBUG_MAX
;
++
i
)
{
if
(
split_debug_view_valid
[
i
])
backtrace_release_view
(
state
,
&
split_debug_view
[
i
],
error_callback
,
data
);
}
if
(
opd
)
if
(
opd
)
backtrace_release_view
(
state
,
&
opd
->
view
,
error_callback
,
data
);
backtrace_release_view
(
state
,
&
opd
->
view
,
error_callback
,
data
);
if
(
descriptor
!=
-
1
)
if
(
descriptor
!=
-
1
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment