Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
Bug 98187 - groff-1.19.1-r2 fails to compile on UCLIBC emerge -e system
Summary: groff-1.19.1-r2 fails to compile on UCLIBC emerge -e system
Status: RESOLVED FIXED
Alias: None
Product: Gentoo Linux
Classification: Unclassified
Component: [OLD] Core system (show other bugs)
Hardware: All Linux
: High blocker (vote)
Assignee: Embedded Gentoo Team
URL:
Whiteboard:
Keywords:
: 108717 (view as bug list)
Depends on:
Blocks:
 
Reported: 2005-07-07 00:03 UTC by Jory A. Pratt
Modified: 2005-12-01 02:08 UTC (History)
4 users (show)

See Also:
Package list:
Runtime testing required: ---


Attachments
libperl-ebuild.diff (libperl.diff,1.16 KB, patch)
2005-07-10 05:21 UTC, solar (RETIRED)
Details | Diff
uClibc-0.9.28-_dl_fini-correct-order.patch (uClibc-0.9.28-_dl_fini-correct-order.patch,2.85 KB, patch)
2005-09-07 11:07 UTC, Martin Schlemmer (RETIRED)
Details | Diff
uClibc-0.9.28-_dl_fini-correct-order.patch (uClibc-0.9.28-_dl_fini-correct-order.patch,2.86 KB, patch)
2005-09-07 11:30 UTC, Martin Schlemmer (RETIRED)
Details | Diff
uClibc-0.9.27-_dl_fini-correct-order.patch (uClibc-0.9.27-_dl_fini-correct-order.patch,5.68 KB, patch)
2005-09-07 11:32 UTC, Martin Schlemmer (RETIRED)
Details | Diff
uClibc-0.9.27-_dl_fini-correct-order.patch (uClibc-0.9.27-_dl_fini-correct-order.patch,5.68 KB, patch)
2005-09-07 11:38 UTC, Martin Schlemmer (RETIRED)
Details | Diff
40_all_uClibc-0.9.27-_dl_fini-correct-order.patch (40_all_uClibc-0.9.27-_dl_fini-correct-order.patch,6.24 KB, patch)
2005-09-25 01:20 UTC, SpanKY
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Jory A. Pratt 2005-07-07 00:03:15 UTC
fails to compile on uclibc stage2 (emerge -e system)

Reproducible: Always
Steps to Reproduce:
1. stage1 bootstrap
2. emerge -e system
3.

Actual Results:  
chmod +x eqn2graph
Making eqn2graph.n from eqn2graph.man
make[2]: Leaving directory
`/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/contrib/eqn2graph'
make[2]: Entering directory
`/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/contrib/grap2graph'
rm -f grap2graph; \
sed -e "s|@g@||g" \
    -e "s|@VERSION@|1.19.1|" \
    -e 1s/a/a/ ./grap2graph.sh >grap2graph; \
chmod +x grap2graph
Making grap2graph.n from grap2graph.man
make[2]: Leaving directory
`/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/contrib/grap2graph'
make[2]: Entering directory
`/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/contrib/groffer'
rm -f groffer; \
sed -e "s|@BINDIR@|/usr/bin|g" \
    -e "s|@VERSION@|1.19.1|g" \
    -e 1s/a/a/ ./groffer.sh >groffer; \
chmod +x groffer
Making groffer.n from groffer.man
make[2]: Leaving directory
`/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/contrib/groffer'
make[2]: Entering directory
`/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/contrib/mom'
cp ./examples/penguin.ps .
test -d examples || /bin/sh
/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/mkinstalldirs examples
touch examples/stamp
GROFF_COMMAND_PREFIX=''; export GROFF_COMMAND_PREFIX; GROFF_BIN_PATH=`echo
/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/src/roff/groff
/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/src/roff/troff
/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/src/devices/grops | sed -e
's|  *|:|g'`; export GROFF_BIN_PATH;
/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/src/roff/groff/groff
-F/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/font
-F/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/font
-M/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/tmac
-M/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/tmac -M. -Tps -mom
examples/letter.mom >examples/letter.ps
/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/src/roff/groff/groff: grops:
Signal 11
make[2]: *** [examples/letter.ps] Error 2
make[2]: Leaving directory
`/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/contrib/mom'
make[1]: *** [contrib/mom] Error 2
make[1]: Leaving directory `/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1'
make: *** [all] Error 2



Portage 2.0.51.22-r1 (uclibc/x86, gcc-3.4.4, uclibc-0.9.27-r0, 2.6.12-gentoo-r3
i686)
=================================================================
System uname: 2.6.12-gentoo-r3 i686 AMD Athlon(TM) XP2200+
Gentoo Base System version 1.6.12
dev-lang/python:     2.3.4-r1, 2.4.1-r1
sys-apps/sandbox:    1.2.10
sys-devel/autoconf:  [Not Present]
sys-devel/automake:  [Not Present]
sys-devel/binutils:  2.16.1
sys-devel/libtool:   [Not Present]
virtual/os-headers:  2.6.11-r2
ACCEPT_KEYWORDS="x86 ~x86"
AUTOCLEAN="yes"
CBUILD="i686-gentoo-linux-uclibc"
CFLAGS="-O2 -march=athlon-xp -fomit-frame-pointer -ftracer
-fprefetch-loop-arrays -pipe"
CHOST="i686-gentoo-linux-uclibc"
CONFIG_PROTECT="/etc /usr/kde/2/share/config /usr/kde/3.4/env
/usr/kde/3.4/share/config /usr/kde/3.4/shutdown /usr/kde/3/share/config
/usr/lib/X11/xkb /usr/share/config /var/qmail/control"
CONFIG_PROTECT_MASK="/etc/gconf /etc/terminfo /etc/env.d"
CXXFLAGS="-O2 -march=athlon-xp -fomit-frame-pointer -ftracer
-fprefetch-loop-arrays -pipe"
DISTDIR="/usr/portage/distfiles"
FEATURES="autoaddcvs autoconfig candy ccache distlocks nodoc noinfo noman
sandbox sfperms strict"
GENTOO_MIRRORS="http://open-systems.ufl.edu/mirrors/gentoo
http://mirror.datapipe.net/gentoo"
LDFLAGS="-Wl,-O1 -Wl,--sort-common"
PKGDIR="/usr/portage/packages"
PORTAGE_TMPDIR="/var/tmp"
PORTDIR="/usr/portage"
SYNC="rsync://rsync.gentoo.org/gentoo-portage"
USE="x86 ncurses python readline uclibc zlib userland_GNU kernel_linux elibc_uclibc"
Unset:  ASFLAGS, CTARGET, LANG, LC_ALL, LINGUAS, MAKEOPTS, PORTDIR_OVERLAY
Comment 1 SpanKY gentoo-dev 2005-07-07 06:48:01 UTC
Signal 11 -> segv

does it fail everytime at the same spot ?
Comment 2 Jory A. Pratt 2005-07-07 08:01:14 UTC
yeah it fails same spot no matter what version I tell it to use.
Comment 3 Jory A. Pratt 2005-07-07 08:46:44 UTC
after a onshot and nodeps on libperl a Signal 6 arrises.
Comment 4 Jory A. Pratt 2005-07-07 12:43:58 UTC
I will leave this up to embedded herd to close at their discreation!

a stable build then converted to ~arch works fine no segv, as I reported earlier
a ~arch stage1 setup however fails with groff. Hopefully you all can figure it
all out.
Comment 5 Stan Behrens 2005-07-09 00:06:43 UTC
having the same problem:

=====[ begin ]=====

make[2]: Entering directory
`/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/contrib/pic2graph'
rm -f pic2graph; \
sed -e "s|@g@||g" \
    -e "s|@VERSION@|1.19.1|" \
    -e 1s/a/a/ ./pic2graph.sh >pic2graph; \
chmod +x pic2graph
Making pic2graph.n from pic2graph.man
make[2]: Leaving directory
`/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/contrib/pic2graph'
make[2]: Entering directory
`/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/contrib/eqn2graph'
rm -f eqn2graph; \
sed -e "s|@g@||g" \
    -e "s|@VERSION@|1.19.1|" \
    -e 1s/a/a/ ./eqn2graph.sh >eqn2graph; \
chmod +x eqn2graph
Making eqn2graph.n from eqn2graph.man
make[2]: Leaving directory
`/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/contrib/eqn2graph'
make[2]: Entering directory
`/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/contrib/grap2graph'
rm -f grap2graph; \
sed -e "s|@g@||g" \
    -e "s|@VERSION@|1.19.1|" \
    -e 1s/a/a/ ./grap2graph.sh >grap2graph; \
chmod +x grap2graph
Making grap2graph.n from grap2graph.man
make[2]: Leaving directory
`/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/contrib/grap2graph'
make[2]: Entering directory
`/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/contrib/groffer'
rm -f groffer; \
sed -e "s|@BINDIR@|/usr/bin|g" \
    -e "s|@VERSION@|1.19.1|g" \
    -e 1s/a/a/ ./groffer.sh >groffer; \
chmod +x groffer
Making groffer.n from groffer.man
make[2]: Leaving directory
`/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/contrib/groffer'
make[2]: Entering directory
`/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/contrib/mom'
cp ./examples/penguin.ps .
test -d examples || /bin/sh
/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/mkinstalldirs examples
touch examples/stamp
GROFF_COMMAND_PREFIX=''; export GROFF_COMMAND_PREFIX; GROFF_BIN_PATH=`echo
/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/src/roff/groff
/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/src/roff/troff
/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/src/devices/grops | sed -e
's|  *|:|g'`; export GROFF_BIN_PATH;
/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/src/roff/groff/groff
-F/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/font
-F/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/font
-M/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/tmac
-M/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/tmac -M. -Tps -mom
examples/letter.mom >examples/letter.ps

=====[ end ]=====

after that it just enters an infinit loop or something, cpu is permanent at 100% 

so i just killed it:

=====[ begin ]====
/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/src/roff/groff/groff: grops:
Signal 15
make[2]: *** [examples/letter.ps] Error 2
make[2]: Leaving directory
`/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1/contrib/mom'
make[1]: *** [contrib/mom] Error 2
make[1]: Leaving directory `/var/tmp/portage/groff-1.19.1-r2/work/groff-1.19.1'
make: *** [all] Error 2

!!! ERROR: sys-apps/groff-1.19.1-r2 failed.
!!! Function src_compile, Line 85, Exitcode 2
!!! (no error message)
!!! If you need support, post the topmost build error, NOT this status message.
=====[ end ]=====

some infos:

# ls /*.tar.bz2
/portage-20050707.tar.bz2  /stage1-x86-uclibc-2005.0.tar.bz2
# emerge --info
Portage 2.0.51.22-r1 (uclibc/x86, gcc-3.4.4, uclibc-0.9.27-r0, 2.6.12-gentoo-r4
i686)
=================================================================
System uname: 2.6.12-gentoo-r4 i686 Intel(R) Pentium(R) M processor 1.60GHz
Gentoo Base System version 1.6.12
dev-lang/python:     2.3.4-r1
sys-apps/sandbox:    1.2.10
sys-devel/autoconf:  [Not Present]
sys-devel/automake:  [Not Present]
sys-devel/binutils:  2.16.1
sys-devel/libtool:   [Not Present]
virtual/os-headers:  2.6.11-r2
ACCEPT_KEYWORDS="x86 ~x86"
AUTOCLEAN="yes"
CBUILD="i686-gentoo-linux-uclibc"
CFLAGS="-march=pentium-m -Os -pipe -fomit-frame-pointer"
CHOST="i686-gentoo-linux-uclibc"
CONFIG_PROTECT="/etc /usr/kde/2/share/config /usr/kde/3/share/config
/usr/lib/X11/xkb /usr/share/config /var/qmail/control"
CONFIG_PROTECT_MASK="/etc/gconf /etc/terminfo /etc/env.d"
CXXFLAGS="-march=pentium-m -Os -pipe -fomit-frame-pointer"
DISTDIR="/usr/portage/distfiles"
FEATURES="autoconfig distlocks nodoc noinfo noman sandbox sfperms strict"
GENTOO_MIRRORS="http://pandemonium.tiscali.de/pub/gentoo/"
PKGDIR="/usr/portage/packages"
PORTAGE_TMPDIR="/var/tmp"
PORTDIR="/usr/portage"
SYNC="rsync://rsync.de.gentoo.org/gentoo-portage"
USE="x86 userland_GNU kernel_linux elibc_uclibc"
Unset:  ASFLAGS, CTARGET, LANG, LC_ALL, LDFLAGS, LINGUAS, MAKEOPTS, PORTDIR_OVERLAY
# grep -v ^# /etc/make.conf | grep .
USE="-* x86"
CHOST="i686-gentoo-linux-uclibc"
CFLAGS="-march=pentium-m -Os -pipe -fomit-frame-pointer"
CXXFLAGS="${CFLAGS}"
ACCEPT_KEYWORDS="~x86"
GENTOO_MIRRORS="http://pandemonium.tiscali.de/pub/gentoo/"
SYNC="rsync://rsync.de.gentoo.org/gentoo-portage"
ALSA_CARDS="intel8x0"
# USE="bzip2 gpm ncurses readline pcre zlib" emerge -e system
 [...]
Comment 6 Jory A. Pratt 2005-07-09 21:09:38 UTC
some info from work dir on ldd groff itself :

 libstdc++.so.6 => /usr/lib/gcc/i686-pc-linux-uclibc/3.4.4/libstdc++.so.6
(0xb7f06000)
 libm.so.0 => /lib/libm.so.0 (0xb7ef7000)
 libgcc_s.so.1 => /usr/lib/gcc/i686-pc-linux-uclibc/3.4.4/libgcc_s.so.1 (0xb7ef0000)
 libc.so.0 => /lib/libc.so.0 (0xb7ea6000)
 ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0xb7f82000)

I will be going threw code to see if I can come up with a patch for this issue
to address the memory issue at hand here.
Comment 7 solar (RETIRED) gentoo-dev 2005-07-10 05:14:23 UTC
I'm pretty sure groff has never worked with uclibc. Its apart of the reason that
we have had it removed from system along with man which depends on this. 

We probably just need to fix libperl
Comment 8 solar (RETIRED) gentoo-dev 2005-07-10 05:18:15 UTC
You should be able to work around this one temp by adding the following to your
system

/etc/portage/package.use: sys-devel/libperl nocxx
Comment 9 solar (RETIRED) gentoo-dev 2005-07-10 05:21:01 UTC
Created attachment 63069 [details, diff]
libperl-ebuild.diff

or with the following patch and no references to nocxx.
Comment 10 Herbert 2005-07-10 07:55:12 UTC
I'm having another problem with groff 1.19.1-r2.

During it's emerge I got millions of messages like this, one after another and
it seams to be an endless loop:

grops:<standard input> (<standard input>):1748: missing argument

If I stop it's emerge with Ctrl-C I got:

grops:<standard input>make[2]: *** Deleting file `pic.ps'
Caught signal 2 in pid 10974
make[2]: *** [pic.ps] Error 130
make[1]: *** [doc] Interrupt
make: *** [all] Interrupt

/usr/portage/sys-apps/groff/groff-1.19.1-r2.ebuild: src_compile aborted; exiting.
Comment 11 Jory A. Pratt 2005-07-10 08:28:34 UTC
solar even with the patch same results are applied. Groff works fine with stable
by the way. this is a GCC-3.4.4 issue I am almost sure about it. I will continue
to look for a better way then removing the man pages and groff from uclibc setup.
Comment 12 solar (RETIRED) gentoo-dev 2005-07-10 20:10:47 UTC
Ok well. We still never had perl depending on it for uclibc. Thats why nobody
noticed it before. (You never needed it)
Comment 13 SpanKY gentoo-dev 2005-07-12 21:51:38 UTC
ok, i can reproduce here in my uclibc chroot with gcc-3.4.4
Comment 14 tud 2005-07-14 21:59:09 UTC
I can reproduce this error with groff-1.19.1-r2 and 1.18.1-r4. I'm using gcc-3.3.5.

I do not get this endless loop also mentioned.
Comment 15 SpanKY gentoo-dev 2005-07-15 05:02:04 UTC
it either goes into a loop or segfaults

either way, disabling sandbox seems to allow groff to complete
Comment 16 Thierry Carrez (RETIRED) gentoo-dev 2005-07-19 09:12:23 UTC
I reproduced the problem in my usual uclibc/hardened stage3 builds.
I use a stable profile...

Avoiding groff by passing a nocxx flag to libperl works fine as a workaround...
but we must still fix the profile somehow so that stage3 builds do not fail.
Comment 17 solar (RETIRED) gentoo-dev 2005-07-19 14:51:52 UTC
rumor has it that if sandbox is disabled groff compiles fine. 
perhaps we are looking in the wrong place?
Comment 18 Jory A. Pratt 2005-07-19 17:33:58 UTC
Solar is for sure a sandbox violation. Spanky nailed it right on the money.
Comment 19 Thierry Carrez (RETIRED) gentoo-dev 2005-07-20 03:15:22 UTC
And how about removing perl from the uclibc profiles completely ? It currently
pulls in :

app-admin/perl-cleaner-1.01
sys-apps/man-1.6-r1
sys-process/cronbase-0.3.2
dev-lang/perl-5.8.6-r5
sys-devel/libperl-5.8.6-r1
sys-apps/groff-1.19.1-r2
sys-apps/texinfo-4.8

If that's not an option, I am considering adding an uclibc/x86/hardened/gnap
profile that would reduce the number of packages I need to build in stage3 just
to remove them in livecd-stage2 (and also workaround this bug :). Any no's/dont's ?
Comment 20 solar (RETIRED) gentoo-dev 2005-07-20 05:33:16 UTC
libperl patch commited to the tree for now.
Comment 21 Brett 2005-07-27 13:25:52 UTC
I also have this error on ppc. I can not get by it.
I tried the following..
FEATURES="-sandbox" emerge groff
USE="nocxx" emerge libperl
My current repoz has the patches applied to libperl.

Anything you need let me know I am dead in an emerge system :(
Comment 22 Martin Schlemmer (RETIRED) gentoo-dev 2005-09-07 11:07:02 UTC
Created attachment 67844 [details, diff]
uClibc-0.9.28-_dl_fini-correct-order.patch

If _DL_FINI_CRT_COMPAT is defined, the libraries's FINI is setup to run at exit
via atexit(), but this makes it run _before_ the fini (__app_fini()) of the
app, causing stuff like sandbox that frees structs, etc via its fini to
segfault.  Same thing for 0.9.27, although things are slightly different.

This patch fixes it, but I consider it more a hack, and 0.9.28's new
__rtld_fini() stuff fixes it properly if _DL_FINI_CRT_COMPAT=n.
Comment 23 Martin Schlemmer (RETIRED) gentoo-dev 2005-09-07 11:30:52 UTC
Created attachment 67846 [details, diff]
uClibc-0.9.28-_dl_fini-correct-order.patch

Might have made a mistake with the casting there, allthough it works fine:

This:

-----
-		if (_dl_atexit)
-			(*_dl_atexit) (_dl_fini);
+		if (__set__dl_fini)
+			(__set__dl_fini)(_dl_fini);
-----

instead of (note the added '*' before __set__dl_fini):

-----
-		if (_dl_atexit)
-			(*_dl_atexit) (_dl_fini);
+		if (__set__dl_fini)
+			(*__set__dl_fini)(_dl_fini);
-----
Comment 24 Martin Schlemmer (RETIRED) gentoo-dev 2005-09-07 11:32:17 UTC
Created attachment 67847 [details, diff]
uClibc-0.9.27-_dl_fini-correct-order.patch

Untested patch for 0.9.27 .. note that I sorda ported _dl_fini() from 0.9.28
...
Comment 25 Martin Schlemmer (RETIRED) gentoo-dev 2005-09-07 11:38:29 UTC
Created attachment 67850 [details, diff]
uClibc-0.9.27-_dl_fini-correct-order.patch

Bah, I should check my patches before I send them anywhere.
Comment 26 SpanKY gentoo-dev 2005-09-25 00:37:29 UTC
Comment on attachment 67846 [details, diff]
uClibc-0.9.28-_dl_fini-correct-order.patch

ive fixed this upstream and i dont plan on enabling DL_FINI_CRT_COMPAT in
uClibc-0.9.28 ebuild so this should be a non-issue
Comment 27 SpanKY gentoo-dev 2005-09-25 01:17:26 UTC
Comment on attachment 67850 [details, diff]
uClibc-0.9.27-_dl_fini-correct-order.patch

ok, i had to tweak nlist and init_fini_list variables, and remove the
'tpnt->init_flag |= FINI_FUNCS_CALLED;' line in the last hunk against ldso.c

once i did that, it seems to work now
Comment 28 SpanKY gentoo-dev 2005-09-25 01:20:49 UTC
Created attachment 69195 [details, diff]
40_all_uClibc-0.9.27-_dl_fini-correct-order.patch

i'm giving this one a spin now in a uclibc chroot (emerge system -e) ... but it
seems to work fine

many thanks az :)
Comment 29 Milan Holzäpfel 2005-09-25 05:07:30 UTC
I can confirm that groff (which is needed by QMail on my side, which does want 
do install manpages) fails as mentioned with sandbox enabled, and succeeds with 

FEATURES="-sandbox -usersandbox" emerge groff

hardened-uclibc profile, gcc-3.4.4-r1, uclibc-0.9.27, groff-1.19.1-r2
Comment 30 SpanKY gentoo-dev 2005-10-10 07:05:23 UTC
*** Bug 108717 has been marked as a duplicate of this bug. ***
Comment 31 R. Bosch 2005-10-10 08:51:48 UTC
(In reply to comment #30)
> *** Bug 108717 has been marked as a duplicate of this bug. ***

Bug 108717 is about compiling Xorg without groff. Might be usefull in the
meantime, until the groff/uclibc issue is resolved...
Comment 32 SpanKY gentoo-dev 2005-12-01 02:08:39 UTC
0.9.27-r1 is in ~arch now as is 0.9.28