#500 closed defect (invalid)
nginx segfaults on Solaris 11.1 x86 when compiled with -m64
| Reported by: | nginxbugger.myopenid.com | Owned by: | |
|---|---|---|---|
| Priority: | minor | Milestone: | |
| Component: | nginx-core | Version: | 1.5.x |
| Keywords: | Cc: | ||
| uname -a: | SunOS solaris 5.11 11.1 i86pc i386 i86pc | ||
| nginx -V: |
nginx version: nginx/1.5.10
built by Sun C 5.12 SunOS_i386 Patch 148918-08 2013/10/18 configure arguments: --with-cc=/opt/solarisstudio12.3/bin/cc --with-cc-opt='-m64 -g' --with-ld-opt=-m64 |
||
Description
Hi,
nginx 1.5.10 segfaults on Solaris 11.1 x86/amd64 when compiled with -m64:
./configure --with-cc=/opt/solarisstudio12.3/bin/cc --with-cc-opt="-m64 -g" --with-ld-opt="-m64"
...
vi objs/Makefile
# remove -fast -xipo
gmake
...
cd objs
dbx nginx
(dbx) run -t
Running: nginx -t
(process id 25357)
signal SEGV (no mapping at the fault address) in ngx_time_update at line 83 in file "ngx_times.c"
83 if (!ngx_trylock(&ngx_time_lock)) {
(dbx) where
=>[1] ngx_time_update(), line 83 in "ngx_times.c"
[2] ngx_time_init(), line 69 in "ngx_times.c"
[3] main(argc = 2, argv = 0xffff80ffbffff498), line 272 in "nginx.c"
(dbx) list
83 if (!ngx_trylock(&ngx_time_lock)) {
84 return;
85 }
86
87 ngx_gettimeofday(&tv);
88
89 sec = tv.tv_sec;
90 msec = tv.tv_usec / 1000;
91
92 ngx_current_msec = (ngx_msec_t) sec * 1000 + msec;
No segfault when compiling with -m32…
Note:
See TracTickets
for help on using tickets.

With the parameters you've supplied, nginx will assume it's building 32-bit binary and will use 32-bit assembler code for atomic instructions (
src/os/unix/ngx_sunpro_x86.il), while 64-bit one is actually required (src/os/unix/ngx_sunpro_amd64.il). This expectedly results in problems.Solution is to use
--with-cpu-opt=amd64instead of adding-m64to ld/cc options manually, like this:It will configure things correctly for you.