- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello,
as a follow-up to my issues with using ICC with GCC 4.9, I now compiled GCC 4.8. How do I now tell ICC to use that? I've tried the -cxxlib=/path/to/gcc-48 switch. But what does it really expect the path to contain? Apparently a bin/g++, OK. But now I get this:
icpc: error #10001: could not find directory in which the set of libstdc++ include files resides
What does this mean? The last lines of output from a strace -f run is pasted below. Note how it finds e.g. /usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/include but then tries to access /usr/include/g++ - why?
[pid 31370] lstat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 [pid 31370] lstat("/home/milian", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0 [pid 31370] lstat("/home/milian/intel", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0 [pid 31370] lstat("/home/milian/intel/gcc48", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0 [pid 31370] lstat("/home/milian/intel/gcc48/bin", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0 [pid 31370] lstat("/home/milian/intel/gcc48/bin/g++", {st_mode=S_IFLNK|0777, st_size=16, ...}) = 0 [pid 31370] readlink("/home/milian/intel/gcc48/bin/g++", "/usr/bin/g++-4.8", 4095) = 16 [pid 31370] lstat("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 [pid 31370] lstat("/usr/bin", {st_mode=S_IFDIR|0755, st_size=126976, ...}) = 0 [pid 31370] lstat("/usr/bin/g++-4.8", {st_mode=S_IFLNK|0777, st_size=9, ...}) = 0 [pid 31370] readlink("/usr/bin/g++-4.8", "g++-4.8.2", 4095) = 9 [pid 31370] lstat("/usr/bin/g++-4.8.2", {st_mode=S_IFREG|0755, st_size=764552, ...}) = 0 [pid 31370] lstat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 [pid 31370] lstat("/home/milian", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0 [pid 31370] lstat("/home/milian/intel", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0 [pid 31370] lstat("/home/milian/intel/gcc48", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0 [pid 31370] lstat("/home/milian/intel/gcc48/bin", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0 [pid 31370] lstat("/home/milian/intel/gcc48/bin/g++", {st_mode=S_IFLNK|0777, st_size=16, ...}) = 0 [pid 31370] readlink("/home/milian/intel/gcc48/bin/g++", "/usr/bin/g++-4.8", 4095) = 16 [pid 31370] lstat("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 [pid 31370] lstat("/usr/bin", {st_mode=S_IFDIR|0755, st_size=126976, ...}) = 0 [pid 31370] lstat("/usr/bin/g++-4.8", {st_mode=S_IFLNK|0777, st_size=9, ...}) = 0 [pid 31370] readlink("/usr/bin/g++-4.8", "g++-4.8.2", 4095) = 9 [pid 31370] lstat("/usr/bin/g++-4.8.2", {st_mode=S_IFREG|0755, st_size=764552, ...}) = 0 [pid 31370] access("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/", X_OK) = 0 [pid 31370] access("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/", X_OK) = 0 [pid 31370] access("/ssd/milian/projects/compiled/kde4/lib/x86_64-unknown-linux-gnu/4.8.2/specs", R_OK) = -1 ENOENT (No such file or directory) [pid 31370] access("/ssd/milian/projects/compiled/kde4/lib/specs", R_OK) = -1 ENOENT (No such file or directory) [pid 31370] access("/ssd/milian/projects/compiled/qt4/lib/x86_64-unknown-linux-gnu/4.8.2/specs", R_OK) = -1 ENOENT (No such file or directory) [pid 31370] access("/ssd/milian/projects/compiled/qt4/lib/specs", R_OK) = -1 ENOENT (No such file or directory) [pid 31370] access("/ssd/milian/projects/compiled/kde4/lib/x86_64-unknown-linux-gnu/4.8.2/specs", R_OK) = -1 ENOENT (No such file or directory) [pid 31370] access("/ssd/milian/projects/compiled/kde4/lib/specs", R_OK) = -1 ENOENT (No such file or directory) [pid 31370] access("/ssd/milian/projects/compiled/qt4/lib/x86_64-unknown-linux-gnu/4.8.2/specs", R_OK) = -1 ENOENT (No such file or directory) [pid 31370] access("/ssd/milian/projects/compiled/qt4/lib/specs", R_OK) = -1 ENOENT (No such file or directory) [pid 31370] access("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/specs", R_OK) = -1 ENOENT (No such file or directory) [pid 31370] access("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../x86_64-unknown-linux-gnu/lib/x86_64-unknown-linux-gnu/4.8.2/specs", R_OK) = -1 ENOENT (No such file or directory) [pid 31370] access("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../x86_64-unknown-linux-gnu/lib/specs", R_OK) = -1 ENOENT (No such file or directory) [pid 31370] access("/usr/lib/gcc/x86_64-unknown-linux-gnu/specs", R_OK) = -1 ENOENT (No such file or directory) [pid 31370] access("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/", X_OK) = 0 [pid 31370] stat("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/lto-wrapper", {st_mode=S_IFREG|0755, st_size=558768, ...}) = 0 [pid 31370] access("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/lto-wrapper", X_OK) = 0 [pid 31370] fstat(1, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0 [pid 31370] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4469593000 [pid 31370] write(1, "install: /usr/lib/gcc/x86_64-unk"..., 1784) = 1784 [pid 31370] exit_group(0) = ? [pid 31370] +++ exited with 0 +++ [pid 31364] <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 31370 [pid 31364] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=31370, si_status=0, si_utime=0, si_stime=0} --- [pid 31364] open("/tmp/icpcgnudirsvPO0ue", O_RDONLY) = 4 [pid 31364] fstat(4, {st_mode=S_IFREG|0600, st_size=1784, ...}) = 0 [pid 31364] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa9513ca000 [pid 31364] read(4, "install: /usr/lib/gcc/x86_64-unk"..., 4096) = 1784 [pid 31364] read(4, "", 4096) = 0 [pid 31364] close(4) = 0 [pid 31364] munmap(0x7fa9513ca000, 4096) = 0 [pid 31364] stat("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 [pid 31364] stat("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/include", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 [pid 31364] fstat(2, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 6), ...}) = 0 [pid 31364] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa9513ca000 [pid 31364] write(2, "icpc: remark #10346: optimizatio"..., 119icpc: remark #10346: optimization reporting will be enabled at link time when performing interprocedural optimizations ) = 119 [pid 31364] open("/home/milian/intel/gcc48/bin/g++", O_RDONLY) = 4 [pid 31364] close(4) = 0 [pid 31364] readlink("/home/milian/intel/gcc48/bin/g++", "/usr/bin/g++-4.8", 4095) = 16 [pid 31364] readlink("/usr/bin/g++-4.8", "g++-4.8.2", 4095) = 9 [pid 31364] readlink("/g++-4.8.2", 0x7fff3da6b3e0, 4095) = -1 ENOENT (No such file or directory) [pid 31364] open("/tmp/icpcdashvZB1Ynz", O_RDONLY) = 4 [pid 31364] fstat(4, {st_mode=S_IFREG|0600, st_size=2423, ...}) = 0 [pid 31364] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa9513c9000 [pid 31364] read(4, "Using built-in specs.\nCOLLECT_GC"..., 4096) = 2423 [pid 31364] read(4, "", 4096) = 0 [pid 31364] close(4) = 0 [pid 31364] munmap(0x7fa9513c9000, 4096) = 0 [pid 31364] stat("=/usr/local/include", 0x7fff3da6c330) = -1 ENOENT (No such file or directory) [pid 31364] stat("/usr/local/include", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 [pid 31364] stat("=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/include", 0x7fff3da6c330) = -1 ENOENT (No such file or directory) [pid 31364] stat("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/include", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 [pid 31364] stat("=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/include-fixed", 0x7fff3da6c330) = -1 ENOENT (No such file or directory) [pid 31364] stat("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/include-fixed", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 [pid 31364] stat("=/usr/include", 0x7fff3da6c330) = -1 ENOENT (No such file or directory) [pid 31364] stat("/usr/include", {st_mode=S_IFDIR|0755, st_size=65536, ...}) = 0 [pid 31364] stat("/usr/include/c++/4.8.2", 0x7fff3da6c330) = -1 ENOENT (No such file or directory) [pid 31364] stat("/usr/x86_64-unknown-linux-gnu/include/c++/4.8.2", 0x7fff3da6c330) = -1 ENOENT (No such file or directory) [pid 31364] open("/home/milian/intel/gcc48/bin/g++", O_RDONLY) = 4 [pid 31364] close(4) = 0 [pid 31364] open("/tmp/icpcdashvZB1Ynz", O_RDONLY) = 4 [pid 31364] fstat(4, {st_mode=S_IFREG|0600, st_size=2423, ...}) = 0 [pid 31364] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa9513c9000 [pid 31364] read(4, "Using built-in specs.\nCOLLECT_GC"..., 4096) = 2423 [pid 31364] read(4, "", 4096) = 0 [pid 31364] close(4) = 0 [pid 31364] munmap(0x7fa9513c9000, 4096) = 0 [pid 31364] stat("/usr/include/g++", 0x7fff3da6c330) = -1 ENOENT (No such file or directory) [pid 31364] write(2, "icpc: error #10001: could not fi"..., 97icpc: error #10001: could not find directory in which the set of libstdc++ include files resides ) = 97 [pid 31364] geteuid() = 1000 [pid 31364] stat("/home/milian/intel/ism/rm", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 [pid 31364] stat("/home/milian/intel/ism/rm", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 [pid 31364] semget(0x11613bf, 2, 0) = 720896 [pid 31364] semctl(720896, 0, IPC_STAT, 0x7fff3da6c110) = 0 [pid 31364] semget(0x11613bf, 5, IPC_CREAT|IPC_EXCL|0600) = -1 EEXIST (File exists) [pid 31364] semget(0x11613bf, 5, 0) = 720896 [pid 31364] semop(720896, {{3, -1, SEM_UNDO|IPC_NOWAIT}}, 1) = -1 EAGAIN (Resource temporarily unavailable) [pid 31364] geteuid() = 1000 [pid 31364] lstat("/tmp/data.VKSjGT", 0x7fff3da6c070) = -1 ENOENT (No such file or directory) [pid 31364] open("/tmp/data.VKSjGT", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4 [pid 31364] fstat(4, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 [pid 31364] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa9513c9000 [pid 31364] write(4, "\0\0\0\0\3\0\0\0\26\0\0\0ccompxe-15.0.0-intel"..., 79) = 79 [pid 31364] close(4) = 0 [pid 31364] munmap(0x7fa9513c9000, 4096) = 0 [pid 31364] mknod("/tmp/intelremotemonfifo.1000", S_IFIFO|0600) = -1 EEXIST (File exists) [pid 31364] open("/tmp/intelremotemonfifo.1000", O_WRONLY|O_NONBLOCK) = 4 [pid 31364] write(4, "/tmp/data.VKSjGT\0", 17) = 17 [pid 31364] unlink("/tmp/icpcdummyiKTfZe.c") = 0 [pid 31364] unlink("/tmp/icpcdashvZB1Ynz") = 0 [pid 31364] unlink("/tmp/icpclibgccqRTyVT") = 0 [pid 31364] unlink("/tmp/icpcgnudirsvPO0ue") = 0 [pid 31364] exit_group(1) = ? [pid 31365] +++ exited with 1 +++ [pid 31364] +++ exited with 1 +++ <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 31364 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=31364, si_status=1, si_utime=0, si_stime=0} --- exit_group(1) = ? +++ exited with 1 +++
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
There are lots of options for special toolchain usage, for example: -gcc-name, -gnu-prefix, -gxx-name, -cxx-lib.
-cxx-lib will just ask ICC to the gcc library you specified in the directory, it will not invoke the "gcc"/"g++" there, it will just invoke the command "gcc"/"g++" which is in PATH currently.
To fully switch to a version of GCC, you can easily do as below:
1. assume you have installed gcc in "/opt/gcc/gcc-4.9.0" when you build it from source.
2. create a file 'gccvar.sh' in 'bin' (or anywhere else) with below contents:
export NGCCDIR=/opt/gcc/gcc-4.9.0
export PATH=$NGCCDIR/bin:$PATH
export LD_LIBRARY_PATH=$NGCCDIR/lib:$NGCCDIR/lib64:$LD_LIBRARY_PATH
export MANPATH=$NGCCDIR/share/man:$MANPATH
3. run "source gccvar.sh" -> now, new gcc is applied (setup) in your environment, you can use it to build your code like "gcc xx.c..."
4. If you want to use ICC, just use as before (source /opt/intel/... ia32/intel64 and then run "icc xx.c..."). New version of GCC and its library will be picked up by ICC.
This is how I enable a specific version of ICC in my environment, you may take it as a reference and let me know whether it works for you.
Thanks,
Shenghong
Below is how I use gcc4.9.0 with ICC sp1 update 2:
$ source /opt/gcc/gcc-4.9.0/bin/gccvars.sh
$ source /opt/intel/composer_xe_2013_sp1.2.144/bin/compilervars.sh intel64
$ icc foo.c
$
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
If I do as you describe, I get the same error output as before. I've created a folder where I put a symlink to my <code>g++-4.8</code> in and added it to my <code>PATH</code>. So that doesn't seem to be enough - where does ICPC expect the include path to be?
Also note this:
icpc -cxxlib=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2 -std=c++11 test.cpp icpc: error #10282: file '/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/bin/g++' not found, generated based on '-cxxlib=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2'
So cxxlib alone does seem to have an affect on where icpc looks for g++.
$ ls /usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2 cc1 include libgcc_eh.a libitm.so libmudflapth.so.0.0.0 libstdc++.so.6.0.18-gdb.py cc1plus include-fixed libgcov.a libitm.so.1 libquadmath.a libsupc++.a collect2 install-tools libgfortran.a libitm.so.1.0.0 libquadmath.so libtsan.a crtbegin.o libasan.a libgfortranbegin.a libitm.spec libquadmath.so.0 libtsan.so crtbeginS.o libasan_preinit.o libgfortran.so liblto_plugin.so libquadmath.so.0.0.0 libtsan.so.0 crtbeginT.o libasan.so libgfortran.so.3 liblto_plugin.so.0 libssp.a libtsan.so.0.0.0 crtend.o libasan.so.0 libgfortran.so.3.0.0 liblto_plugin.so.0.0.0 libssp_nonshared.a lto1 crtendS.o libasan.so.0.0.0 libgfortran.spec libmudflap.a libssp.so lto-wrapper crtfastmath.o libatomic.a libgomp.a libmudflap.so libssp.so.0 plugin crtprec32.o libatomic.so libgomp.so libmudflap.so.0 libssp.so.0.0.0 crtprec64.o libatomic.so.1 libgomp.so.1 libmudflap.so.0.0.0 libstdc++.a crtprec80.o libatomic.so.1.0.0 libgomp.so.1.0.0 libmudflapth.a libstdc++.so f951 libcaf_single.a libgomp.spec libmudflapth.so libstdc++.so.6 finclude libgcc.a libitm.a libmudflapth.so.0 libstdc++.so.6.0.18
This is the folder where my system installed the older 4.8.2 GCC to. I have a similar folder for 4.9.0. The binaries are in /usr/bin/gcc-4.8
etc. Is icpc not interpreting the output of GCC's -E -v to find include paths? See e.g.:
$ /usr/bin/g++-4.8 -x c++ -fsyntax-only -E -v /dev/null Using built-in specs. COLLECT_GCC=/usr/bin/g++-4.8 Target: x86_64-unknown-linux-gnu Configured with: /tmp/yaourt-tmp-milian/aur-gcc48/src/gcc-4.8.2/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,fortran --enable-shared --enable-threads=posix --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --enable-gnu-unique-object --with-ppl --disable-multilib --disable-werror --enable-linker-build-id --enable-cloog-backend=isl --enable-lto --enable-gold --enable-ld=default --enable-plugin --with-plugin-ld=ld.gold --program-suffix=-4.8.2 --enable-version-specific-runtime-libs --enable-checking=release Thread model: posix gcc version 4.8.2 (GCC) COLLECT_GCC_OPTIONS='-fsyntax-only' '-E' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' /usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/cc1plus -E -quiet -v -D_GNU_SOURCE /dev/null -mtune=generic -march=x86-64 -fsyntax-only ignoring nonexistent directory "/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../x86_64-unknown-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/include/c++ /usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/include/c++/x86_64-unknown-linux-gnu /usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/include/c++/backward /usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/include /usr/local/include /usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/include-fixed /usr/include End of search list. # 1 "/dev/null" # 1 "" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 1 " " 2 # 1 "/dev/null" COMPILER_PATH=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/:/usr/lib/gcc/x86_64-unknown-linux-gnu/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/:/usr/lib/gcc/x86_64-unknown-linux-gnu/ LIBRARY_PATH=/ssd/milian/projects/compiled/kde4/lib/../lib/:/ssd/milian/projects/compiled/qt4/lib/../lib/:/ssd/milian/projects/compiled/kde4/lib/../lib/:/ssd/milian/projects/compiled/qt4/lib/../lib/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/ssd/milian/projects/compiled/kde4/lib/:/ssd/milian/projects/compiled/qt4/lib/:/ssd/milian/projects/compiled/kde4/lib/:/ssd/milian/projects/compiled/qt4/lib/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-fsyntax-only' '-E' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
I'll now try the other command line switches you mentioned and see whether I have more luck there...
Thanks!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Milian,
Thank you for the update. It looks like you build GCC and use default installation (install to system directories), and maybe gcc install some libs to that folder...The "/usr/lib/x86_64..." folder is kind of 'Ubuntu/Debian-specific' standard (as I known) to store some libraries.
Whatever, if you build GCC in future, I'd suggest you to install to a directory defined by yourself, something like "/opt/gcc4.9" (when you run 'configure' for GCC, add --prefix=/opt/gcc4.9"), in this case, you can be more easily to figure out where these libraries are stored, and my above scripts will works easily (when you use default installation options, GCC MAY install to multiple folders, such as /usr/lib, /usr/lib/x86_64...).
Thanks,
Shenghong

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page