I'm writing a program in Java and I need to determine the architecture for which Linux was compiled.
I need something like uname -m, but without running any program, but instead from the /proc pseduo-fs.
What is a reliable source to read from?
As you can have a 32-bit Linux installed in a 64-bit machine, the safer way seems to be verifying CPU capabilities. For Intel and compatible processors:
grep -o -w 'lm' /proc/cpuinfo http://www.unixtutorial.org/2009/05/how-to-confirm-if-your-cpu-is-32bit-or-64bit/
What you're looking for is the following flag: lm. It stands for X86_FEATURE_LM, the Long Mode (64bit) support. If you can find the "lm" flag among your CPU flags, this means you're looking at a 64bit capable processor.
Everything I'm seeing tells me that the unamebinary simply makes a syscall to uname() to get it's information, so this may be more difficult that you want. If you're willing to implement some JNI, I'd recommend going doing so and issuing the syscall. The closest valuable pseudo file from /proc I can find is /proc/sys/kernel/osrelease, which on my system has contents of 4.2.3-300.fc23.x86_64. This will change with versions, and may change dramatically between flavors of Linux, so it may not be as reliable as you need.
cat /proc/sys/kernel/osrelease do not include information about architecture :) it is like this: 4.1.15-gentoo-r1-scantlight3 It looks like there is no file with line with uname -m output, i.e. x86_64 or ppc64le. Arch is not stored in /proc/cpuinfo nor in files in /proc/sys/kernel/.
But maybe slightly better than to parse /proc/cpuinfo (Rui F Ribeiro's xaccepted answer) is to parse /sys/devices/system/cpu/modalias:
$ cat /sys/devices/system/cpu/modalias # x86_64 cpu:type:x86,ven0000fam0006mod005E:feature:,0000,0001,0002,0003... $ cat /sys/devices/system/cpu/modalias # s390x cpu:type:z13:feature:,0000,0001,0002,0003,0004,0005,0006,0007,0008,0009,000A,000B But then there is a question how to map these.
BTW in kernel it's defined as UTS_MACHINE := $(ARCH) in Makefile and if needed adjusted by archs:
ifeq ($(CONFIG_X86_32),y) ... UTS_MACHINE := i386 ... else ... UTS_MACHINE := x86_64 ... UTS_MACHINE := $(subst $(space),,$(machine-y)) UTS_MACHINE := s390x ifeq ($(CONFIG_CPU_BIG_ENDIAN), y) ... UTS_MACHINE := aarch64_be else ... UTS_MACHINE := aarch64 endif Try uname command.
$ man uname
or
$ uname -a
See ya,
uname; something reading from the /proc filesystem.
cat /proc/versionorcat /proc/cpuinfo.uname -m?