I *must* be doing something epic wrong here.
However :
$
$ cat -n memalign_test.c
1 #define _POSIX_SOURCE 1
2
3 #include <ctype.h>
4 #include <errno.h>
5 #include <locale.h>
6 #include <stddef.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10
11 int main(int argc, char *argv[]) {
12
13 char *buffer;
14
15 buffer = memalign( (size_t) 64, (size_t) 8 );
16 if ( buffer == NULL )
17 /*****************************************
18 * ENOMEM *
19 * In the future we will want to recover *
20 * from this sort of epic fail. At the *
21 * very least, a syslog entry. *
22 *****************************************/
23 exit ( EXIT_FAILURE );
24
25 buffer[0] = '\0'; /* something useful */
26
27 return ( EXIT_SUCCESS );
28 }
29
$
$ echo $CFLAGS
-erroff -xstrconst -xildoff -m64 -xmemalign=8s -xnolibmil -Xa -xcode=pic32
-xregs=no%appl -xlibmieee -mc -g -xs -ftrap=%none -Qy -xbuiltin=%none
-xdebugformat=dwarf -xunroll=1 -xtarget=ultraT2 -xcache=8/16/4:4096/64/16
-D_TS_ERRNO -D_POSIX_PTHREAD_SEMANTICS -D_LARGEFILE64_SOURCE -D_DEBUG
-DCGIEXTENDED
$ uname -a
SunOS node002 5.10 Generic_147440-23 sun4v sparc SUNW,T5240
$ cc -V
cc: Sun C 5.9 SunOS_sparc Patch 124867-16 2010/08/11
usage: cc [ options] files. Use 'cc -flags' for details
$ cc -\# $CFLAGS -o memalign_test.o -c memalign_test.c
### Note: NLSPATH =
/opt/SUNWspro/prod/bin/../lib/locale/%L/LC_MESSAGES/%N.cat:/opt/SUNWspro/prod/bin/../../lib/locale/%L/LC_MESSAGES/%N.cat
### command line files and options (expanded):
### -c -D_TS_ERRNO -D_POSIX_PTHREAD_SEMANTICS -D_LARGEFILE64_SOURCE -D_DEBUG
-DCGIEXTENDED -erroff=%all -g -mc -Xa -xarch=sparcvis2 -m64
-xcache=8/16/4:4096/64/16 -xchip=ultraT2 -xcode=pic32 -xdebugformat=dwarf
-xlibmieee -xmemalign=8s -xregs=no%appl -xs -xstrconst -xunroll=1
memalign_test.c -o memalign_test.o
/opt/SUNWspro/prod/bin/acomp -dg -xldscope=global -i memalign_test.c -y-fbe
-y/opt/SUNWspro/prod/bin/fbe -y-xcode=pic32 -y-xarch=v9b -y-xmemalign=8s -y-g
-y-o -ymemalign_test.o -y-verbose -y-xthreadvar=dynamic -y-comdat
-xdbggen=no%stabs+dwarf2+usedonly -e rroff=%all -strconst -D_TS_ERRNO
-D_POSIX_PTHREAD_SEMANTICS -D_LARGEFILE64_SOURCE -D_DEBUG -DCGIEXTENDED
-xdbggen=incl -y-s -2K -m64 -fparam_ir -Qy -D__SunOS_5_10 -D__SUNPRO_C=0x590
-D__SVR4 -D__sun -D__SunOS -D__unix -D__sparcv9 -D__sparc
-D__BUILTIN_VA_ARG_INCR -D__C99FEATURES__ -Xa -D__PRAGMA_REDEFINE_EXTNAME
-Dunix -Dsun -Dsparc -D__RESTRICT -xc99=%all,no%lib -D__FLT_EVAL_METHOD__=0
-I/opt/SUNWspro/prod/include/cc "-g/opt/SUNWspro/prod/bin/cc -erroff -xstrconst
-xildoff -m64 -xmemalign=8s -xnolibmil -Xa -xcode=pic32 -xregs=no%appl
-xlibmieee -mc -g -xs -ftrap=%none -Qy -xbuiltin=%none -xdebugformat=dwarf
-xunroll=1 -xtarget=ultraT2 -xcache=8/16/4:4096/64/16 -D_TS_ERRNO
-D_POSIX_PTHREAD_SEMANTICS -D_LARGEFILE64_SOURCE -
D_DEBUG -DCGIEXTENDED -o memalign_test.o -c " -fsimple=0 -D__SUN_PREFETCH
-destination_ir=yabe
/usr/ccs/bin/mcs -c memalign_test.o
$ cc -\# $CFLAGS -o memalign_test memalign_test.o
### Note: NLSPATH =
/opt/SUNWspro/prod/bin/../lib/locale/%L/LC_MESSAGES/%N.cat:/opt/SUNWspro/prod/bin/../../lib/locale/%L/LC_MESSAGES/%N.cat
### command line files and options (expanded):
### -D_TS_ERRNO -D_POSIX_PTHREAD_SEMANTICS -D_LARGEFILE64_SOURCE -D_DEBUG
-DCGIEXTENDED -erroff=%all -g -mc -Xa -xarch=sparcvis2 -m64
-xcache=8/16/4:4096/64/16 -xchip=ultraT2 -xcode=pic32 -xdebugformat=dwarf
-xlibmieee -xmemalign=8s -xregs=no%appl -xs -xstrconst -xunroll=1
memalign_test.o -o memalign_test
### Note: LD_LIBRARY_PATH = <null>
### Note: LD_LIBRARY_PATH_64 = <null>
### Note: LD_RUN_PATH = <null>
/usr/ccs/bin/ld /opt/SUNWspro/prod/lib/v9/crti.o
/opt/SUNWspro/prod/lib/v9/crt1.o /opt/SUNWspro/prod/lib/v9/values-xi.o -o
memalign_test memalign_test.o -Y
"P,/opt/SUNWspro/prod/lib/sparcvis2/64:/opt/SUNWspro/prod/lib/v9:/usr/ccs/lib/sparcv9:/lib/sparcv9:/usr/lib/sparcv9"
-Qy -lc /opt/SUNWspro/prod/lib/v9/crtn.o
/usr/ccs/bin/mcs -c memalign_test
$
$ dbx memalign_test
Reading memalign_test
Reading ld.so.1
Reading libc.so.1
(dbx) stop at 1
(2) stop at "memalign_test.c":15
(dbx) run
Running: memalign_test
(process id 19599)
Reading libc_psr.so.1
stopped in main at line 15 in file "memalign_test.c"
15 buffer = memalign( (size_t) 64, (size_t) 8 );
(dbx) print buffer
buffer = (nil)
(dbx) step
stopped in main at line 16 in file "memalign_test.c"
16 if ( buffer == NULL )
(dbx) print buffer
buffer = 0x101080 "<bad address 0x101080>"
(dbx) step
stopped in main at line 25 in file "memalign_test.c"
25 buffer[0] = '\0'; /* something useful */
(dbx) step
signal SEGV (no mapping at the fault address) in main at line 25 in file
"memalign_test.c"
25 buffer[0] = '\0'; /* something useful */
(dbx) quit
$
$
Good ol malloc :
$ cat -n foo.c
1 #define _POSIX_SOURCE 1
2
3 #include <ctype.h>
4 #include <errno.h>
5 #include <locale.h>
6 #include <stddef.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10
11 int main(int argc, char *argv[]) {
12
13 char *buffer;
14
15 buffer = malloc( (size_t) 8 );
16 if ( buffer == NULL )
17 /*****************************************
18 * ENOMEM *
19 * In the future we will want to recover *
20 * from this sort of epic fail. At the *
21 * very least, a syslog entry. *
22 *****************************************/
23 exit ( EXIT_FAILURE );
24
25 buffer[0] = '\0'; /* something useful */
26
27 return ( EXIT_SUCCESS );
28 }
29
$
$ cc $CFLAGS -o foo foo.c
$ dbx foo
Reading foo
Reading ld.so.1
Reading libc.so.1
(dbx) stop at 1
(2) stop at "foo.c":15
(dbx) run
Running: foo
(process id 19633)
Reading libc_psr.so.1
stopped in main at line 15 in file "foo.c"
15 buffer = malloc( (size_t) 8 );
(dbx) print buffer
buffer = (nil)
(dbx) step
stopped in main at line 16 in file "foo.c"
16 if ( buffer == NULL )
(dbx) print buffer
buffer = 0x100100fc0 ""
(dbx) step
stopped in main at line 25 in file "foo.c"
25 buffer[0] = '\0'; /* something useful */
(dbx) step
stopped in main at line 27 in file "foo.c"
27 return ( EXIT_SUCCESS );
(dbx) print buffer
buffer = 0x100100fc0 ""
(dbx) step
stopped in main at line 28 in file "foo.c"
28 }
(dbx) step
execution completed, exit code is 0
(dbx) quit
$
So I went and looked at
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libbc/libc/gen/common/memalign.c
to see, what bloody obvious thing I am doing wrong[1]. Perhaps alignment
means bytes and I should have 8 there. Not sure.
Dennis
[1] other than leaving out the free(buffer)
_______________________________________________
opensolaris-code mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/opensolaris-code