Bug #6576
closedshared library references _environ macosx Lion
Description
The code in missing/setproctitle.c references the global variable environ.
The environ global variable isn't allowed in mac dylib shared libraries.
Code trying to use ruby-2 as a shared library will fail.
% nm libruby.dylib|grep _environ
U _environ
The code in hash.c has #ifdef APPLE sections that appear to access
the environment using Apple's suggested _NSGetEnviron() routine.
Updated by kosaki (Motohiro KOSAKI) over 12 years ago
- Status changed from Open to Assigned
- Assignee set to kosaki (Motohiro KOSAKI)
Updated by nobu (Nobuyoshi Nakada) over 12 years ago
- Status changed from Assigned to Feedback
=begin
Actually it doesn't fail.
$ uname -svr
Darwin 11.4.0 Darwin Kernel Version 11.4.0: Mon Apr 9 19:32:15 PDT 2012; root:xnu-1699.26.8~1/RELEASE_X86_64
$ otool -L /usr/local/bin/ruby
/usr/local/bin/ruby:
@executable_path/../lib/libruby.2.0.0.dylib (compatibility version 2.0.0, current version 2.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
$ /usr/local/bin/ruby -e '$0 = "x"*100; system("ps", $$.to_s)'
PID TT STAT TIME COMMAND
77027 s002 S+ 0:00.02 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Or do you talking about future versions?
=end
Updated by djk (Daniel Kopetzky) over 12 years ago
I'll investigate further.
Had recently enabled ruby scripting in vim 7.3.548 and I got the following message
% /usr/local/bin/vim
dyld: Symbol not found: _environ
Referenced from: /usr/local/lib/libruby.2.0.0.dylib
Expected in: flat namespace
in /usr/local/lib/libruby.2.0.0.dylib
Trace/BPT trap
Thats when I went reading your code / reading apple documentation and saw how hash.c was avoiding
direct reference to environ but missing/setproctitle.c wasn't doing anything special.
% otool -L /usr/local/bin/vim
src/vim:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
/usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/local/lib/libintl.8.dylib (compatibility version 10.0.0, current version 10.1.0)
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 17.0.0)
/usr/local/lib/libruby.2.0.0.dylib (compatibility version 2.0.0, current version 2.0.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 53.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 635.21.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 833.25.0)
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1138.47.0)
Updated by nobu (Nobuyoshi Nakada) over 12 years ago
Does /usr/local/bin/ruby fail too?
What does otool -L /usr/local/bin/ruby
show?
Updated by nobu (Nobuyoshi Nakada) over 12 years ago
- Status changed from Feedback to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r36151.
Daniel, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
setproctitle.c: _NSGetEnviron
- missing/setproctitle.c (environ): use (*_NSGetEnviron()) instead of
environ on Darwin for namespace cleanness, same as [ruby-core:00537].
[ruby-core:45615] [Bug #6576]