개인 공부/리눅스

Centos 7, SPEC2006 설치 - 1

RyoTTa 2021. 3. 11. 21:55
반응형

sjp38.github.io/ko/post/spec_cpu2006_install/ 블로그 참조

https://github.com/SangJe/spec2006 github 참조

 

환경

Intel(R) Xeon(R) Gold 6226R CPU @ 2.90GHz x2

CentOS Linux release 7.9.2009 (Core)

Linux 3.10.0-1160.el7.x86_64

gcc version 8.3.0 (GCC) (scl enable devtoolset-8)

 

소스코드

spec_cpu2006.iso를 연구실에서 구매후 설치를 준비한다. 벤치마크 소스와 컴파일, 수행, 검증을 위한 tool 프로그램들의 기본 바이너리 파일 및 소스가 존재하며 벤치마크 실행을 위한 규칙파일, 도큐먼트들이 존재한다.

$ mkdir tmnt
$ sudo mount -o loop spec_cpu2006.iso ./tmnt
$ ls tmnt

위와같이 iso파일을 마운트하여 외부 파일경로에 설치, 실행을 하여도 좋지만 sudo 권환으로 마운트된 경우 owner가 root 이며 변경 가능한 권한이 존재하지 않기 때문에 owner와 permission을 수정한 후 설치 진행을 하겠다.

$ mkdir spec_cpu2006
$ cp -R ./tmnt/* spec_cpu2006/
$ sudo umount ./tmnt && rm -fr ./tmnt
$ sudo chown -R <username> spec_cpu2006
$ sudo chmod -R 755 spec_cpu2006
$ cd spec_cpu2006

빌드

SPEC 2006 내부에는 벤치마크 빌드 위한 기본적인 tools의 바이너리 파일이 존재한다. 하지만 시스템에 맞지않는 바이너리 파일이 있을경우 소스코드를 직접 컴파일하여 사용해야한다. 해당 소스코드파일들은 아래에 위치한다.

$ cd tools/src
$ ./buildtools

./buildtools는 script 파일이고 해당 폴더 아래에 있는 tools set들을 차례로 컴파일 하게된다. 

또한 정상적으로 마운트한게 아닌 다른 꼼수를 사용하여 이를 다운받았을 때는 폴더 아래의 여러 tools들 (bzip2-1.0.3,  expat-1.95.8, make-3.80, makedepf90-2.6.2, nttar-1.11.2a, specinvoke, specmd5sum, tar-1.15.1, perl-5.8.7)들에게도 Configure 파일이 존재하니 이들을 모두 실행가능한 파일로 수정해야 한다. 여기서는 그냥 모두 chmod 755를 통해 실행가능한 파일로 수정했다.

 

실행가능한 파일로 수정되면 위의 script로 컴파일을 수행할 수 있다.

 

Conflicing types for 'getline'

하지만 md5sum을 컴파일하는 도중 위와같은 에러를 출력하며 비정상 종료를 하게된다.

md5sum 빌드중 getline(), getdelim() 함수가 stdio.h에 선언되어있음에도 불구하고 getline.h에서 재 선언 되어 충돌이 나는 문제이다. md5sum 아래의 getline.h에 해당 재 선언을 피하는 코드를 추가하여 컴파일하게 하면된다.

nano ./tools/src/specmd5sum/lib/getline.h
#ifndef GETLINE_H_
# define GETLINE_H_ 1

# include <stdio.h>

# ifndef PARAMS
#  if defined (__GNUC__) || __STDC__
#   define PARAMS(args) args
#  else
#   define PARAMS(args) ()
#  endif
# endif

# if __GLIBC__ < 2

int
getline PARAMS ((char **_lineptr, size_t *_n, FILE *_stream));

int
getdelim PARAMS ((char **_lineptr, size_t *_n, int _delimiter, FILE *_stream));

#endif

#endif /* not GETLINE_H_ */

 

 

make: *** No rule to make target `<command-line>', needed by `miniperlmain.o 

 

해결책은 tools/src/perl-5.87/makedepend.SH (makedepend가 아님)를 열고 해당 위치에 필터링을 추가하면 된다. 이 파일에서 명령 줄을 찾아 같은 방식으로 command-line을 필터링한다.

nano ./tools/src/perl-5.87/makedepend.SH
....
	    -e '/^#.*<stdin>/d' \
            -e '/^#.*<builtin>/d' \
            -e '/^#.*<built-in>/d' \
            -e '/^#.*<command line>/d' \
			-e '/^#.*<command-line>/d' \ #추가
....

 

undefined reference to pow

cc -L/user1/ryotta205/SPEC2006/tools/output/lib -L/usr/local/lib -o miniperl \
    miniperlmain.o opmini.o libperl.a
libperl.a(pp.o): In function `Perl_pp_pow':
pp.c:(.text+0x2b42): undefined reference to `pow'

perl 컴파일 중 위와같은 에러 메세지가 발생한다.

pow 함수를 찾지 못하는 것으로, libm 라이브러리를 Link 시점에 Link하도록 직접 알려줘야 한다. 다음과 같이 PERLFLAGS 환경변수를 설정하고 buildtoos를 실행한다.

PERLFLAGS="-A libs=-lm -A libs=-ldl" ./buildtools

 

asm/page.h file not found

 

커널 헤더파일인 asm/page.h 파일을 tools/src/perl-5.8.8/ext/IPC/SysV/SysV.xs 파일에서 include 하고 있어 발생하는 문제가 다음과 같이 발생한다.

cc -c   -I/user1/ryotta205/SPEC2006/tools/output/include -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O2   -DVERSION=\"1.04\" -DXS_VERSION=\"1.04\" -fpic "-I../../.."   SysV.c
SysV.xs:7:25: fatal error: asm/page.h: No such file or directory

tools/src/perl-5.8.8/ext/IPC/SysV/SysV.xs 파일의 해당 include 문을 제거하고 PAGE_SIZE를 #define으로 정의해준다.

nano ./tools/src/perl-5.8.8/ext/IPC/SysV/SysV.xs
#ifdef __linux__
#   include <asm/page.h> #삭제
#define PAGE_SIZE      4096 #추가

 

/usr/bin/ld: final link failed: Nonrepresentable section on output

/usr/bin/ld: /user1/ryotta205/SPEC2006/tools/output/lib/libbz2.a(blocksort.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
make: *** [blib/arch/auto/Compress/Bzip2/Bzip2.so] Error 1
+ testordie 'error building/installing Compress-Bzip2-2.09'
+ test 2 -ne 0
+ echo '!!! error building/installing Compress-Bzip2-2.09'
PERLFLAGS="-A libs=-lm -A libs=-ldl" BZIP2CFLAGS=-fPIC ./buildtools

 

etc..

nano tools/src/make-3.81/glob/glob.c
--# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION (at line 54)
++# if _GNU_GLOB_INTERFACE_VERSION >= GLOB_INTERFACE_VERSION (at line 54)
--#if !defined __alloca && !defined GNU_LIBRARY (at line 209)
++#if !defined __alloca && defined GNU_LIBRARY (at line 209)

위와 같이 빌드를 실행하면된다.

 

반응형