Bug 23853 - Symlinked sourcefiles not found
Summary: Symlinked sourcefiles not found
Status: RESOLVED FIXED
Alias: None
Product: gdb
Classification: Unclassified
Component: symtab (show other bugs)
Version: HEAD
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2018-11-02 21:12 UTC by Keith Seitz
Modified: 2019-02-22 20:09 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Keith Seitz 2018-11-02 21:12:10 UTC
GDB cannot find default symtabs when they are symlinks:

$ ln -s example.c example-link.c
$ gcc -g example-link.c -o example
$ gdb -nx -q example -ex "b 10"
Reading symbols from example...
(gdb) list
11	   GNU General Public License for more details.
12	
13	   You should have received a copy of the GNU General Public License
14	   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
15	
16	static int
17	foo (void)
18	{
19	  return 0; /* break here  */
20	}
(gdb) 
21	
22	int
23	main (void)
24	{
25	  return foo ();
26	}
(gdb) b 19
No line 19 in the current file.
Make breakpoint pending on future shared library load? (y or [n])
Comment 1 Sourceware Commits 2019-02-22 19:59:46 UTC
The master branch has been updated by Keith Seitz <kseitz@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=bb995d00b3eef2f48d0be895c3509a7ddd8280a1

commit bb995d00b3eef2f48d0be895c3509a7ddd8280a1
Author: Keith Seitz <keiths@redhat.com>
Date:   Fri Feb 22 09:39:35 2019 -0800

    Fix symtab/23853: symlinked default symtab
    
    This patch attempts to fix a bug dealing with setting breakpoints
    in default symtabs that are symlinks.  For example:
    
    (gdb) list
    11	   GNU General Public License for more details.
    12
    13	   You should have received a copy of the GNU General Public License
    14	   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
    15
    16	static int
    17	foo (void)
    18	{
    19	  return 0; /* break here  */
    20	}
    (gdb)
    21
    22	int
    23	main (void)
    24	{
    25	  return foo ();
    26	}
    (gdb) b 19
    No line 19 in the current file.
    Make breakpoint pending on future shared library load? (y or [n])
    
    The problem here is that when create_sals_line_offset sets the default
    symtab, it immediately calls symtab_to_fullname, passing that fullname
    to collect_symtabs_from_filename to find all matching symtabs.  This
    fails because we end up looking for a symtab with the name of the
    actual file on disk (which is different in this case because of the
    symlink) instead of the one stored in the debug info.
    
    Since we already have the lookup name of the default symtab, use it
    instead of the fullname. [This fullname thing was originally added
    in 2007 in a series dealing with *displaying* absolute file names.
    Clearly, this instance has nothing to do with the display of file names.]
    
    gdb/ChangeLog
    
    	PR symtab/23853
    	* linespec.c (create_sals_line_offset): Search for the default
    	symtab's filename instead of its fullname.
    
    gdb/testsuite/ChangeLog
    
    	PR symtab/23853
    	* gdb.base/symlink-sourcefile.c: New file.
    	* gdb.base/symlink-sourcefile.exp: New file.
Comment 2 Keith Seitz 2019-02-22 20:09:53 UTC
Patch committed.