Bug 15415 - gdb resolves symbolic links when passing argv[0]
Summary: gdb resolves symbolic links when passing argv[0]
Status: RESOLVED FIXED
Alias: None
Product: gdb
Classification: Unclassified
Component: gdb (show other bugs)
Version: 7.6
: P2 normal
Target Milestone: 7.6.1
Assignee: Jan Kratochvil
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2013-04-29 10:42 UTC by Pedro Alves
Modified: 2013-10-13 16:11 UTC (History)
5 users (show)

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


Attachments
Patch for following symlinks (286 bytes, patch)
2013-07-17 12:51 UTC, Florian Baumert
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Pedro Alves 2013-04-29 10:42:22 UTC
Submitting on behalf of David Kastrup.  Ref:
<http://lists.gnu.org/archive/html/bug-gdb/2013-04/msg00001.html>

Calling gdb on an executable that is a symbolic link will pass the
target of the symbolic link rather than the specified link as
argv[0] to the program.

As a result, if the program relies on the contents of argv[0] (for
example, for figuring out paths relative to the executable or making
decisions based on the name the executable has been called under),
debugging fails.

Here is an example for a program relying on its argv[0] name:
/usr/bin/latex is a symbolic link to /usr/bin/pdftex, and pdftex loads a
format depending on the name under which it has been called. As a
result,

latex '\stop'

will load the latex.fmt format and finish processing while the same will
fail under gdb since argv[0] is being passed as /usr/bin/pdftex instead
of /usr/bin/latex:

dak@lola:/tmp$ latex '\stop'
This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012/Debian)
 restricted \write18 enabled.
entering extended mode
LaTeX2e <2011/06/27>
Babel <v3.8m> and hyphenation patterns for english, dumylang, nohyphenation, bu
lgarian, ukrainian, russian, loaded.
No pages of output.
Transcript written on texput.log.

dak@lola:/tmp$ gdb latex
GNU gdb (GDB) 7.5.91.20130417-cvs-ubuntu
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /usr/bin/pdftex...(no debugging symbols found)...done.
(gdb) run '\stop'
Starting program: /usr/bin/pdftex '\stop'
This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012/Debian)
 restricted \write18 enabled.
entering extended mode
! Undefined control sequence.
 
<*> \stop

(...)

I have verified that the problem is still present in current master
(checking out the git mirror).  I have not been able to figure out just
when it has been introduced, and I don't have a clue where to look in
the code (the obvious grep for "readlink" did not really succeed in
letting me find a suspect).
Comment 1 Ian Hulin 2013-05-17 00:06:53 UTC
This is really flakey and has cost me several days effort on my project establishing that this is a gdb bug.  

Here are the gdb versions I have found this on and a short terminal session transcript:

ian@nanny-ogg ~/src/lilypond/build (T3154)$ gdb --command ../.gdbinit
GNU gdb (GDB) 7.5.91.20130417-cvs-ubuntu
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Breakpoint 1 at 0x834b744: file /home/ian/src/lilypond/flower/warn.cc,
line 191.
Breakpoint 2 at 0x8147057: file /home/ian/src/lilypond/lily/grob.cc,
line 729.
(gdb) run
Starting program: /home/ian/src/lilypond/build/lily/out/lilypond
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/i386-linux-gnu/libthread_db.so.1".
GNU LilyPond 2.17.19
warning: not relocating, no 2.17.19/ or current/ found under
/home/ian/src/lilypond/build/lily/share/lilypond/
ERROR: In procedure primitive-load-path:
ERROR: Unable to find file "lily.scm" in load path
[Inferior 1 (process 11595) exited with code 01]
(gdb)
=======================================================================
Comment 2 Florian Baumert 2013-07-17 11:29:01 UTC
Replacing xfullpath with gdb_realname seems to have triggered this.

http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/source.c.diff?r1=1.153.2.3&r2=1.136&cvsroot=src&f=h

We use symbolic links to executables a lot, so this breaks our ability to debug programs at the moment.
Comment 3 Florian Baumert 2013-07-17 11:30:12 UTC
Sorry, gdb_realpath instead of gdb_realname.

(In reply to Florian Baumert from comment #2)
> Replacing xfullpath with gdb_realname seems to have triggered this.
> 
> http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/source.c.diff?r1=1.153.2.
> 3&r2=1.136&cvsroot=src&f=h
> 
> We use symbolic links to executables a lot, so this breaks our ability to
> debug programs at the moment.
Comment 4 Florian Baumert 2013-07-17 12:51:10 UTC
Created attachment 7108 [details]
Patch for following symlinks

Fix which works for me (at least in the cases we tried, not thoroughly tested)
Comment 5 dje 2013-08-03 01:15:10 UTC
Another thing to consider is auxiliary file names based on the name of the binary.  e.g. ${foo}-gdb.py, ${foo}.dwp.

I can imagine some situations wanting gdb to xfullpath $foo and I can imagine some situations wanting gdb to realpath $foo.
gdb needs to either try both (maybe fullpath first, then realpath) or give the user a way to specify which one.
[It would be simplest to do the former if that works in a sufficient number of cases.]

Given that a realpath operation cannot be undone (one can't get back the original path), I suggest for now we go back to using xfullpath, and then start working on support for realpath.
Comment 6 Jan Kratochvil 2013-08-26 18:22:02 UTC
[patch] [7.6.1] Fix argv[0] symlink regression (PR 15415)
https://sourceware.org/ml/gdb-patches/2013-08/msg00764.html
Message-ID: <20130826182111.GA19509@host2.jankratochvil.net>
Comment 7 cvs-commit@gcc.gnu.org 2013-08-28 17:52:05 UTC
CVSROOT:	/cvs/src
Module name:	src
Changes by:	jkratoch@sourceware.org	2013-08-28 17:52:03

Modified files:
	gdb            : ChangeLog corefile.c defs.h exec.c exec.h 
	                 inferior.c progspace.c progspace.h source.c 
	gdb/mi         : mi-main.c 
	gdb/testsuite  : ChangeLog 
Added files:
	gdb/testsuite/gdb.base: argv0-symlink.c argv0-symlink.exp 

Log message:
	PR gdb/15415
	
	gdb/
	2013-08-27  Jan Kratochvil  <jan.kratochvil@redhat.com>
	
	PR gdb/15415
	* corefile.c (get_exec_file): Use exec_filename.
	* defs.h (OPF_DISABLE_REALPATH): New definition.  Add new comment.
	* exec.c (exec_close): Free EXEC_FILENAME.
	(exec_file_attach): New variable canonical_pathname.  Use
	OPF_DISABLE_REALPATH.  Call gdb_realpath explicitly.  Set
	EXEC_FILENAME.
	* exec.h (exec_filename): New.
	* inferior.c (print_inferior, inferior_command): Use
	PSPACE_EXEC_FILENAME.
	* mi/mi-main.c (print_one_inferior): Likewise.
	* progspace.c (clone_program_space, print_program_space): Likewise.
	* progspace.h (struct program_space): New field pspace_exec_filename.
	* source.c (openp): Describe OPF_DISABLE_REALPATH.  New variable
	realpath_fptr, initialize it from OPF_DISABLE_REALPATH, use it.
	
	gdb/testsuite/
	2013-08-27  Jan Kratochvil  <jan.kratochvil@redhat.com>
	
	PR gdb/15415
	* gdb.base/argv0-symlink.c: New file.
	* gdb.base/argv0-symlink.exp: New file.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/ChangeLog.diff?cvsroot=src&r1=1.15939&r2=1.15940
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/corefile.c.diff?cvsroot=src&r1=1.74&r2=1.75
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/defs.h.diff?cvsroot=src&r1=1.332&r2=1.333
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/exec.c.diff?cvsroot=src&r1=1.127&r2=1.128
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/exec.h.diff?cvsroot=src&r1=1.21&r2=1.22
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/inferior.c.diff?cvsroot=src&r1=1.42&r2=1.43
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/progspace.c.diff?cvsroot=src&r1=1.17&r2=1.18
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/progspace.h.diff?cvsroot=src&r1=1.12&r2=1.13
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/source.c.diff?cvsroot=src&r1=1.163&r2=1.164
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/mi/mi-main.c.diff?cvsroot=src&r1=1.238&r2=1.239
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/ChangeLog.diff?cvsroot=src&r1=1.3789&r2=1.3790
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/gdb.base/argv0-symlink.c.diff?cvsroot=src&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/gdb.base/argv0-symlink.exp.diff?cvsroot=src&r1=NONE&r2=1.1
Comment 8 cvs-commit@gcc.gnu.org 2013-08-28 17:55:57 UTC
CVSROOT:	/cvs/src
Module name:	src
Branch: 	gdb_7_6-branch
Changes by:	jkratoch@sourceware.org	2013-08-28 17:55:56

Modified files:
	gdb            : ChangeLog corefile.c defs.h exec.c exec.h 
	                 inferior.c progspace.c progspace.h source.c 
	gdb/mi         : mi-main.c 
	gdb/testsuite  : ChangeLog 
Added files:
	gdb/testsuite/gdb.base: argv0-symlink.c argv0-symlink.exp 

Log message:
	PR gdb/15415
	
	gdb/
	2013-08-27  Jan Kratochvil  <jan.kratochvil@redhat.com>
	
	PR gdb/15415
	* corefile.c (get_exec_file): Use exec_filename.
	* defs.h (OPF_DISABLE_REALPATH): New definition.  Add new comment.
	* exec.c (exec_close): Free EXEC_FILENAME.
	(exec_file_attach): New variable canonical_pathname.  Use
	OPF_DISABLE_REALPATH.  Call gdb_realpath explicitly.  Set
	EXEC_FILENAME.
	* exec.h (exec_filename): New.
	* inferior.c (print_inferior, inferior_command): Use
	PSPACE_EXEC_FILENAME.
	* mi/mi-main.c (print_one_inferior): Likewise.
	* progspace.c (clone_program_space, print_program_space): Likewise.
	* progspace.h (struct program_space): New field pspace_exec_filename.
	* source.c (openp): Describe OPF_DISABLE_REALPATH.  New variable
	realpath_fptr, initialize it from OPF_DISABLE_REALPATH, use it.
	
	gdb/testsuite/
	2013-08-27  Jan Kratochvil  <jan.kratochvil@redhat.com>
	
	PR gdb/15415
	* gdb.base/argv0-symlink.c: New file.
	* gdb.base/argv0-symlink.exp: New file.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/ChangeLog.diff?cvsroot=src&only_with_tag=gdb_7_6-branch&r1=1.15260.2.58&r2=1.15260.2.59
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/corefile.c.diff?cvsroot=src&only_with_tag=gdb_7_6-branch&r1=1.72&r2=1.72.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/defs.h.diff?cvsroot=src&only_with_tag=gdb_7_6-branch&r1=1.329&r2=1.329.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/exec.c.diff?cvsroot=src&only_with_tag=gdb_7_6-branch&r1=1.122&r2=1.122.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/exec.h.diff?cvsroot=src&only_with_tag=gdb_7_6-branch&r1=1.20&r2=1.20.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/inferior.c.diff?cvsroot=src&only_with_tag=gdb_7_6-branch&r1=1.41&r2=1.41.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/progspace.c.diff?cvsroot=src&only_with_tag=gdb_7_6-branch&r1=1.17&r2=1.17.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/progspace.h.diff?cvsroot=src&only_with_tag=gdb_7_6-branch&r1=1.12&r2=1.12.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/source.c.diff?cvsroot=src&only_with_tag=gdb_7_6-branch&r1=1.153.2.3&r2=1.153.2.4
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/mi/mi-main.c.diff?cvsroot=src&only_with_tag=gdb_7_6-branch&r1=1.228&r2=1.228.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/ChangeLog.diff?cvsroot=src&only_with_tag=gdb_7_6-branch&r1=1.3580.2.23&r2=1.3580.2.24
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/gdb.base/argv0-symlink.c.diff?cvsroot=src&only_with_tag=gdb_7_6-branch&r1=NONE&r2=1.1.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/gdb.base/argv0-symlink.exp.diff?cvsroot=src&only_with_tag=gdb_7_6-branch&r1=NONE&r2=1.1.2.2
Comment 9 Jan Kratochvil 2013-08-28 17:58:18 UTC
Fixed in trunk and for 7.6.1.
Comment 10 cvs-commit@gcc.gnu.org 2013-10-13 16:11:10 UTC
CVSROOT:	/cvs/src
Module name:	src
Changes by:	jkratoch@sourceware.org	2013-10-13 16:11:08

Modified files:
	gdb            : ChangeLog exec.c utils.c utils.h 
	gdb/testsuite  : ChangeLog 
	gdb/testsuite/gdb.base: argv0-symlink.exp 

Log message:
	Improve Executable displayed path (PR 15415 regression kind #2)
	
	gdb/
	2013-10-13  Jan Kratochvil  <jan.kratochvil@redhat.com>
	
	Canonicalize directories for EXEC_FILENAME.
	* exec.c (exec_file_attach): Use gdb_realpath_keepfile for
	exec_filename.
	* utils.c (gdb_realpath_keepfile): New function.
	* utils.h (gdb_realpath_keepfile): New declaration.
	
	gdb/testsuite/
	2013-10-13  Jan Kratochvil  <jan.kratochvil@redhat.com>
	
	Canonicalize directories for EXEC_FILENAME.
	* gdb.base/argv0-symlink.exp
	(kept file symbolic link name for info inferiors): New.
	(kept directory symbolic link name): Setup kfail.
	(kept directory symbolic link name for info inferiors): New.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/ChangeLog.diff?cvsroot=src&r1=1.16100&r2=1.16101
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/exec.c.diff?cvsroot=src&r1=1.129&r2=1.130
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/utils.c.diff?cvsroot=src&r1=1.309&r2=1.310
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/utils.h.diff?cvsroot=src&r1=1.13&r2=1.14
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/ChangeLog.diff?cvsroot=src&r1=1.3835&r2=1.3836
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/gdb.base/argv0-symlink.exp.diff?cvsroot=src&r1=1.1&r2=1.2