ruby-changes:37313
From: nobu <ko1@a...>
Date: Sat, 24 Jan 2015 21:24:43 +0900 (JST)
Subject: [ruby-changes:37313] nobu:r49394 (trunk): ruby.c: replace with real path
nobu 2015-01-24 21:24:27 +0900 (Sat, 24 Jan 2015) New Revision: 49394 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=49394 Log: ruby.c: replace with real path * ruby.c (dladdr_path): replace the executable path with symlinked real path. dladdr(3) on Linux returns the argv[0] as dli_fname instead of the real path, for a symbol defined in the executable file itself. [Bug #10776] Modified files: trunk/file.c trunk/ruby.c Index: ruby.c =================================================================== --- ruby.c (revision 49393) +++ ruby.c (revision 49394) @@ -364,6 +364,32 @@ ruby_init_loadpath(void) https://github.com/ruby/ruby/blob/trunk/ruby.c#L364 ruby_init_loadpath_safe(0); } +#if defined(HAVE_DLADDR) +static VALUE +dladdr_path(const void* addr) +{ + Dl_info dli; + VALUE fname, path; + + if (!dladdr(addr, &dli)) { + return rb_str_new(0, 0); + } +#ifdef __linux__ + else if (dli.dli_fname == origarg.argv[0]) { + VALUE rb_readlink(VALUE); + fname = rb_str_new_cstr("/proc/self/exe"); + path = rb_readlink(fname); + } +#endif + else { + fname = rb_str_new_cstr(dli.dli_fname); + path = rb_realpath_internal(Qnil, fname, 1); + } + rb_str_resize(fname, 0); + return path; +} +#endif + void ruby_init_loadpath_safe(int safe_level) { @@ -392,17 +418,7 @@ ruby_init_loadpath_safe(int safe_level) https://github.com/ruby/ruby/blob/trunk/ruby.c#L418 #elif defined(__EMX__) _execname(libpath, sizeof(libpath) - 1); #elif defined(HAVE_DLADDR) - Dl_info dli; - if (dladdr((void *)(VALUE)expand_include_path, &dli)) { - char fbuf[MAXPATHLEN]; - char *f = dln_find_file_r(dli.dli_fname, getenv(PATH_ENV), fbuf, sizeof(fbuf)); - VALUE fname = rb_str_new_cstr(f ? f : dli.dli_fname); - rb_str_freeze(fname); - sopath = rb_realpath_internal(Qnil, fname, 1); - } - else { - sopath = rb_str_new(0, 0); - } + sopath = dladdr_path((void *)(VALUE)expand_include_path); libpath = RSTRING_PTR(sopath); #endif Index: file.c =================================================================== --- file.c (revision 49393) +++ file.c (revision 49394) @@ -2745,7 +2745,7 @@ rb_file_s_symlink(VALUE klass, VALUE fro https://github.com/ruby/ruby/blob/trunk/file.c#L2745 #endif #ifdef HAVE_READLINK -static VALUE rb_readlink(VALUE path); +VALUE rb_readlink(VALUE path); /* * call-seq: @@ -2764,7 +2764,7 @@ rb_file_s_readlink(VALUE klass, VALUE pa https://github.com/ruby/ruby/blob/trunk/file.c#L2764 return rb_readlink(path); } -static VALUE +VALUE rb_readlink(VALUE path) { int size = 100; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/