[前][次][番号順一覧][スレッド一覧]

ruby-changes:68099

From: xtkoba <ko1@a...>
Date: Fri, 24 Sep 2021 04:29:26 +0900 (JST)
Subject: [ruby-changes:68099] 77e6715d67 (master): Interpret `DW_RLE_start_length`

https://git.ruby-lang.org/ruby.git/commit/?id=77e6715d67

From 77e6715d67b92b16bcb4588e0da37b494cdc5278 Mon Sep 17 00:00:00 2001
From: xtkoba <69125751+xtkoba@u...>
Date: Fri, 30 Apr 2021 23:29:57 +0900
Subject: Interpret `DW_RLE_start_length`

Fixes [Bug #17823]
---
 addr2line.c | 27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/addr2line.c b/addr2line.c
index 06d682a..6c3143a 100644
--- a/addr2line.c
+++ b/addr2line.c
@@ -1436,16 +1436,17 @@ ranges_include(DebugInfoReader *reader, ranges_t *ptr, uint64_t addr) https://github.com/ruby/ruby/blob/trunk/addr2line.c#L1436
         /* TODO: support base address selection entry */
         const char *p;
         uint64_t base = ptr->low_pc_set ? ptr->low_pc : reader->current_low_pc;
+        bool base_valid = true;
         if (reader->obj->debug_rnglists.ptr) {
             p = reader->obj->debug_rnglists.ptr + ptr->ranges;
             for (;;) {
                 uint8_t rle = read_uint8(&p);
-                uintptr_t base_address = 0;
-                uintptr_t from, to;
+                uintptr_t from = 0, to = 0;
                 if (rle == DW_RLE_end_of_list) break;
                 switch (rle) {
                   case DW_RLE_base_addressx:
                     uleb128(&p);
+                    base_valid = false; /* not supported yet */
                     break;
                   case DW_RLE_startx_endx:
                     uleb128(&p);
@@ -1456,24 +1457,26 @@ ranges_include(DebugInfoReader *reader, ranges_t *ptr, uint64_t addr) https://github.com/ruby/ruby/blob/trunk/addr2line.c#L1457
                     uleb128(&p);
                     break;
                   case DW_RLE_offset_pair:
-                    from = base_address + uleb128(&p);
-                    to = base_address + uleb128(&p);
-                    if (base + from <= addr && addr < base + to) {
-                        return from;
-                    }
+                    if (!base_valid) break;
+                    from = (uintptr_t)base + uleb128(&p);
+                    to = (uintptr_t)base + uleb128(&p);
                     break;
                   case DW_RLE_base_address:
-                    base_address = (uintptr_t)read_dw_form_addr(reader, &p);
+                    base = read_dw_form_addr(reader, &p);
+                    base_valid = true;
                     break;
                   case DW_RLE_start_end:
-                    read_dw_form_addr(reader, &p);
-                    read_dw_form_addr(reader, &p);
+                    from = (uintptr_t)read_dw_form_addr(reader, &p);
+                    to = (uintptr_t)read_dw_form_addr(reader, &p);
                     break;
                   case DW_RLE_start_length:
-                    read_dw_form_addr(reader, &p);
-                    uleb128(&p);
+                    from = (uintptr_t)read_dw_form_addr(reader, &p);
+                    to = from + uleb128(&p);
                     break;
                 }
+                if (from <= addr && addr < to) {
+                    return from;
+                }
             }
             return false;
         }
-- 
cgit v1.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]