sudo-project / sudo

Utility to execute a command as another user
https://www.sudo.ws
Other
1.16k stars 208 forks source link

Undefined symbols for architecture x86_64: "_environ" #276

Closed Schamschula closed 1 year ago

Schamschula commented 1 year ago

After the update to sudo 1.9.14 the MacPorts build bots found the following build error for macOS 10.6 (i386 and x86_64) and 10.7:

libtool: link: /usr/bin/clang -dynamiclib  -o .libs/sudo_intercept.so  .libs/exec_preload.o .libs/sudo_intercept.o .libs/sudo_intercept_common.o .libs/intercept.pb-c.o   -Wl,-force_load,../lib/protobuf-c/.libs/libprotobuf-c.a  -L/opt/local/lib ../lib/util/.libs/libsudo_util.dylib /opt/local/lib/libintl.dylib -lcrypto -ldl  -Wl,-headerpad_max_install_names -arch x86_64 -fstack-protector-all   -install_name  /opt/local/libexec/sudo/sudo_intercept.so  -Wl,-single_module
Undefined symbols for architecture x86_64:
  "_environ", referenced from:
      _my_system in sudo_intercept.o
      _my_execv in sudo_intercept.o
      _my_execvp in sudo_intercept.o
      _exec_wrapper in sudo_intercept.o
      _execl_wrapper in sudo_intercept.o
      _sudo_interposer_init in sudo_intercept_common.o
ld: symbol(s) not found for architecture x86_64

I worked around this with

https://github.com/macports/macports-ports/blob/master/sysutils/sudo/files/patch-environ.diff

However, I couldn't find any change between 1.9.13p3 and 1.9.14 to cause this issue, as 1.9.13p3 built cleanly on this platforms.

See: https://ports.macports.org/port/sudo/builds/

millert commented 1 year ago

I don't know of any code changes that would have caused this but in 1.9.14 the -no-undefined libtool flag is used on darwin. Perhaps that is causing the problem.

Schamschula commented 1 year ago

No such problem on newer versions of macOS, even with this flag.

millert commented 1 year ago

Can you try backing out ae12d18ff04c3b242c2790a937659cfd68649947 to see if that makes a difference? I don't have access macOS versions that old.

Schamschula commented 1 year ago

Just for the record. My patch is only for macOS. The header file doesn't exist for other Apple OSs, e.g. iOS.

See: https://bug-gnulib.gnu.narkive.com/3IFzYnBv/environ-on-macos-x

I personally don't have access to older versions of macOS. MacPorts GitHub CI only supports macOS 11 - 13.

millert commented 1 year ago

It turns out I had an old macOS 10.6.8 hackintosh in the closet. I was able to reproduce the problem and verified that backing out https://github.com/sudo-project/sudo/commit/ae12d18ff04c3b242c2790a937659cfd68649947 avoids the issue.

Schamschula commented 1 year ago

In other words https://github.com/sudo-project/sudo/commit/ae12d18ff04c3b242c2790a937659cfd68649947 could be modified to only apply to darwin 12 and above.

millert commented 1 year ago

Yes, exactly.

Schamschula commented 1 year ago

Perhaps a form of my patch might be a better solution, as it defines _environ for older macOS versions.

millert commented 1 year ago

Yes, the patch is needed to be able to actually use intercept mode and log_subcmds. The -no-undefined turns a run-time error into a link-time error so that is working as intended.

millert commented 1 year ago

Fixed by a0b074c

Schamschula commented 1 year ago

Thanks!