| From 6c08b5606863a359afa6db0db4d88137c3a7602d Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 5 Nov 2019 21:17:06 -0800 |
| Subject: scripts/gdb: fix debugging modules compiled with hot/cold |
| partitioning |
| |
| From: Ilya Leoshkevich <iii@linux.ibm.com> |
| |
| [ Upstream commit 8731acc5068eb3f422a45c760d32198175c756f8 ] |
| |
| gcc's -freorder-blocks-and-partition option makes it group frequently |
| and infrequently used code in .text.hot and .text.unlikely sections |
| respectively. At least when building modules on s390, this option is |
| used by default. |
| |
| gdb assumes that all code is located in .text section, and that .text |
| section is located at module load address. With such modules this is no |
| longer the case: there is code in .text.hot and .text.unlikely, and |
| either of them might precede .text. |
| |
| Fix by explicitly telling gdb the addresses of code sections. |
| |
| It might be tempting to do this for all sections, not only the ones in |
| the white list. Unfortunately, gdb appears to have an issue, when |
| telling it about e.g. loadable .note.gnu.build-id section causes it to |
| think that non-loadable .note.Linux section is loaded at address 0, |
| which in turn causes NULL pointers to be resolved to bogus symbols. So |
| keep using the white list approach for the time being. |
| |
| Link: http://lkml.kernel.org/r/20191028152734.13065-1-iii@linux.ibm.com |
| Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> |
| Reviewed-by: Jan Kiszka <jan.kiszka@siemens.com> |
| Cc: Kieran Bingham <kbingham@kernel.org> |
| Cc: Heiko Carstens <heiko.carstens@de.ibm.com> |
| Cc: Vasily Gorbik <gor@linux.ibm.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| scripts/gdb/linux/symbols.py | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/scripts/gdb/linux/symbols.py b/scripts/gdb/linux/symbols.py |
| index 004b0ac7fa72d..4644f1a83b578 100644 |
| --- a/scripts/gdb/linux/symbols.py |
| +++ b/scripts/gdb/linux/symbols.py |
| @@ -99,7 +99,8 @@ lx-symbols command.""" |
| attrs[n]['name'].string(): attrs[n]['address'] |
| for n in range(int(sect_attrs['nsections']))} |
| args = [] |
| - for section_name in [".data", ".data..read_mostly", ".rodata", ".bss"]: |
| + for section_name in [".data", ".data..read_mostly", ".rodata", ".bss", |
| + ".text", ".text.hot", ".text.unlikely"]: |
| address = section_name_to_address.get(section_name) |
| if address: |
| args.append(" -s {name} {addr}".format( |
| -- |
| 2.20.1 |
| |