Undefined symbols for architecture x86_64: "_environ"
Schamschula opened this issue · 11 comments
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.
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.
No such problem on newer versions of macOS, even with this flag.
Can you try backing out ae12d18 to see if that makes a difference? I don't have access macOS versions that old.
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.
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 ae12d18 avoids the issue.
In other words ae12d18 could be modified to only apply to darwin 12 and above.
Yes, exactly.
Perhaps a form of my patch might be a better solution, as it defines _environ
for older macOS versions.
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.
Thanks!