* Allow API dwarf_loclist_n() and dwarf_loclist() to be called with
attributes that have form DW_FORM_sec_offset. * If the .debug_info section conforms to DWARF4, do not allow the value of attributes with form DW_FORM_data[48] to be used as section offset.
This commit is contained in:
parent
255d921adc
commit
bc5fce8d8f
@ -56,8 +56,20 @@ dwarf_loclist_n(Dwarf_Attribute at, Dwarf_Locdesc ***llbuf,
|
|||||||
switch (at->at_form) {
|
switch (at->at_form) {
|
||||||
case DW_FORM_data4:
|
case DW_FORM_data4:
|
||||||
case DW_FORM_data8:
|
case DW_FORM_data8:
|
||||||
ret = _dwarf_loclist_find(at->at_die->die_dbg,
|
/*
|
||||||
at->at_die->die_cu, at->u[0].u64, &ll, error);
|
* DW_FORM_data[48] can not be used as section offset
|
||||||
|
* since DWARF4. For DWARF[23], the application needs
|
||||||
|
* to determine if DW_FORM_data[48] is representing
|
||||||
|
* a constant or a section offset.
|
||||||
|
*/
|
||||||
|
if (at->at_die->die_cu->cu_version >= 4) {
|
||||||
|
DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
|
||||||
|
return (DW_DLV_NO_ENTRY);
|
||||||
|
}
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
case DW_FORM_sec_offset:
|
||||||
|
ret = _dwarf_loclist_find(dbg, at->at_die->die_cu,
|
||||||
|
at->u[0].u64, &ll, error);
|
||||||
if (ret == DW_DLE_NO_ENTRY) {
|
if (ret == DW_DLE_NO_ENTRY) {
|
||||||
DWARF_SET_ERROR(dbg, error, ret);
|
DWARF_SET_ERROR(dbg, error, ret);
|
||||||
return (DW_DLV_NO_ENTRY);
|
return (DW_DLV_NO_ENTRY);
|
||||||
@ -119,6 +131,19 @@ dwarf_loclist(Dwarf_Attribute at, Dwarf_Locdesc **llbuf,
|
|||||||
switch (at->at_form) {
|
switch (at->at_form) {
|
||||||
case DW_FORM_data4:
|
case DW_FORM_data4:
|
||||||
case DW_FORM_data8:
|
case DW_FORM_data8:
|
||||||
|
/*
|
||||||
|
* DW_FORM_data[48] can not be used as section offset
|
||||||
|
* since DWARF4. For DWARF[23], the application needs
|
||||||
|
* to determine if DW_FORM_data[48] is representing
|
||||||
|
* a constant or a section offset.
|
||||||
|
*/
|
||||||
|
if (at->at_die->die_cu->cu_version >= 4) {
|
||||||
|
printf("called cu_version >= 4\n");
|
||||||
|
DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
|
||||||
|
return (DW_DLV_NO_ENTRY);
|
||||||
|
}
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
case DW_FORM_sec_offset:
|
||||||
ret = _dwarf_loclist_find(at->at_die->die_dbg,
|
ret = _dwarf_loclist_find(at->at_die->die_dbg,
|
||||||
at->at_die->die_cu, at->u[0].u64, &ll, error);
|
at->at_die->die_cu, at->u[0].u64, &ll, error);
|
||||||
if (ret == DW_DLE_NO_ENTRY) {
|
if (ret == DW_DLE_NO_ENTRY) {
|
||||||
|
Loading…
Reference in New Issue
Block a user