Recently, I wrote a blog post about suspected new editions: Enteprise Core edition and Standard Core Edition.
This morning, I received a mention from twitter coming from Franck Pachot:
In GV$INSTANCE definition, we can see that edition is encoded in X$KSUXSINST view (in the column KSUXSEDITION). The corresponding code is this one:
- 2 = PO = Personal Ed.
- 4 = SE = Standard Ed.
- 8 = EE = Enterprise Ed.
- 16 = XE = eXpress Ed.
- 32 = CS = Standard Core Ed.
- 64 = CE = Enterprise Core Ed.
- 128 = HP = Enterprise Ed. High Perf
- 256 = XP = Enteprise Ed. Extreme Perf
How Oracle use these codes to determine Oracle Edition ?
When, you relink your Oracle kernel, you use ins_rdbms.mk makefile located in $ORACLE_HOME/rdbms/lib and you run a make command with specific targets.
For example, if you wan to link Core Enterprise Edition, you will run this (See my previous blog post):
$ make -f ins_rdbms.mk edition_coreenterprise ioracle
Deploying Oracle Database Core Enterprise Edition
mv -f /u01/app/oracle/product/12.2.0/dbhome_1/lib/libvsn12.a /u01/app/oracle/product/12.2.0/dbhome_1/lib/libvsn12_backup.a.dbl
cp /u01/app/oracle/product/12.2.0/dbhome_1/lib/libvsn12_cee.a.dbl /u01/app/oracle/product/12.2.0/dbhome_1/lib/libvsn12.a
chmod 755 /u01/app/oracle/product/12.2.0/dbhome_1/bin
In fact, it uses a library which is copied as $ORACLE_HOME/lib/libvsn12.a and then this library is linked to Oracle kernel.
There are many libraries in the 12.2 kernel:
$ cd $ORACLE_HOME/lib
$ ls libvsn* -l
-rw-r--r-- 1 oracle oinstall 10774 Nov 28 17:47 libvsn12.a
-rw-r--r-- 1 oracle oinstall 10742 Oct 4 00:46 libvsn12.a.default
-rw-r--r-- 1 oracle oinstall 10774 Nov 28 17:40 libvsn12_backup.a.dbl
-rw-r--r-- 1 oracle oinstall 10790 Oct 4 00:46 libvsn12_cee.a.dbl
-rw-r--r-- 1 oracle oinstall 10790 Oct 4 00:46 libvsn12_cse.a.dbl
-rw-r--r-- 1 oracle oinstall 10774 Oct 4 00:46 libvsn12_hp.a.dbl
-rw-r--r-- 1 oracle oinstall 10766 Oct 4 00:46 libvsn12_std.a.dbl
-rw-r--r-- 1 oracle oinstall 10774 Oct 4 00:46 libvsn12_xp.a.dbl
After a closer look inside those libraries, I found they are containing two object files (.o)
$ ar -t libvsn12_hp.a.dbl
vsnhp.o
vsnfhp.o
$ ar -t libvsn12_cee.a.dbl
vsncee.o
vsnfcee.o
$ ar -t libvsn12_std.a.dbl
vsnstd.o
vsnfstd.o
etc...
After extracting these files from the library, and reading the ELF section, we can see:
- the vsnXXX.o file contains the banner
- the vsnfXXX.o file contains other things but I don’t know what yet.
$ ar -x libvsn12_cee.a.dbl
$ objdump -s vsncee.o
vsncee.o: file format elf64-x86-64
Contents of section .comment:
.../...
Contents of section .rodata:
0000 4f726163 6c652044 61746162 61736520 Oracle Database
0010 31326320 456e7465 72707269 73652045 12c Enterprise E
0020 64697469 6f6e202d 20436f72 65202564 dition - Core %d
0030 2e25642e 25642e25 642e2564 20257300 .%d.%d.%d.%d %s.
0040 00000000 40000000 2d203634 62697420 ....@...- 64bit
0050 50726f64 75637469 6f6e0000 00000000 Production......
$ objdump -s vsnfcee.o
vsnfcee.o: file format elf64-x86-64
Contents of section .comment:
.../...
Contents of section text.unlikely:
0000 90909090 90909090 90909090 90909090 ................
0010 66905548 89e5b840 00000048 89ec5dc3 f.UH...@...H..].
Contents of section .eh_frame:
0000 14000000 00000000 01000178 100c0708 ...........x....
0010 90010000 00000000 2c000000 1c000000 ........,.......
0020 00000000 00000000 10000000 00000000 ................
0030 04030000 000e1004 03000000 0c061086 ................
0040 02040900 0000c600 ........
If we compare these sections (text.unlikely and .eh_frame) between many Edition library files, we can see the following points:
- Eh_frame section contains exception unwinding and source language information. They shouldn’t be very different:
$ objdump -s -j .eh_frame vsnfcee.o vsnfxp.o vsnfhp.o vsnfstd.o vsnfcse.o
vsnfcee.o: file format elf64-x86-64
Contents of section .eh_frame:
0000 14000000 00000000 01000178 100c0708 ...........x....
0010 90010000 00000000 2c000000 1c000000 ........,.......
0020 00000000 00000000 10000000 00000000 ................
0030 04030000 000e1004 03000000 0c061086 ................
0040 02040900 0000c600 ........
vsnfxp.o: file format elf64-x86-64
Contents of section .eh_frame:
0000 14000000 00000000 01000178 100c0708 ...........x....
0010 90010000 00000000 2c000000 1c000000 ........,.......
0020 00000000 00000000 10000000 00000000 ................
0030 04030000 000e1004 03000000 0c061086 ................
0040 02040900 0000c600 ........
vsnfhp.o: file format elf64-x86-64
Contents of section .eh_frame:
0000 14000000 00000000 01000178 100c0708 ...........x....
0010 90010000 00000000 2c000000 1c000000 ........,.......
0020 00000000 00000000 10000000 00000000 ................
0030 04030000 000e1004 03000000 0c061086 ................
0040 02040900 0000c600 ........
vsnfstd.o: file format elf64-x86-64
Contents of section .eh_frame:
0000 14000000 00000000 01000178 100c0708 ...........x....
0010 90010000 00000000 2c000000 1c000000 ........,.......
0020 00000000 00000000 10000000 00000000 ................
0030 04030000 000e1004 03000000 0c061086 ................
0040 02040900 0000c600 ........
vsnfcse.o: file format elf64-x86-64
Contents of section .eh_frame:
0000 14000000 00000000 01000178 100c0708 ...........x....
0010 90010000 00000000 2c000000 1c000000 ........,.......
0020 00000000 00000000 10000000 00000000 ................
0030 04030000 000e1004 03000000 0c061086 ................
0040 02040900 0000c600 ........
Indeed, these sections are identical.
- Now let’s see the .text.unlikely section:
$ objdump -s -j text.unlikely vsnfcee.o vsnfxp.o vsnfhp.o vsnfstd.o vsnfcse.o
vsnfcee.o: file format elf64-x86-64
Contents of section text.unlikely:
0000 90909090 90909090 90909090 90909090 ................
0010 66905548 89e5b840 00000048 89ec5dc3 f.UH...@...H..].
vsnfxp.o: file format elf64-x86-64
Contents of section text.unlikely:
0000 90909090 90909090 90909090 90909090 ................
0010 66905548 89e5b800 01000048 89ec5dc3 f.UH.......H..].
vsnfhp.o: file format elf64-x86-64
Contents of section text.unlikely:
0000 90909090 90909090 90909090 90909090 ................
0010 66905548 89e5b880 00000048 89ec5dc3 f.UH.......H..].
vsnfstd.o: file format elf64-x86-64
Contents of section text.unlikely:
0000 90909090 90909090 90909090 90909090 ................
0010 66905548 89e5b804 00000048 89ec5dc3 f.UH.......H..].
vsnfcse.o: file format elf64-x86-64
Contents of section text.unlikely:
0000 90909090 90909090 90909090 90909090 ................
0010 66905548 89e5b820 00000048 89ec5dc3 f.UH... ...H..].
At the first look, they seem identical … but they are not, the section highlighted in red is different, and as my platform is linux and so little-endian platform, we have to read the highlighted blocks like this:
- vsnfstd.o : 0x00 04 = 4
- vsnfcse.o 0x00 20 = 32
- vsnfcee.o : 0x00 40 = 64
- vsnfhp.o : 0x00 80 = 128
- vsnfxp.o : 0x01 00 = 256
So Oracle have just some libraries that encore the edition, and this code seems to enable some option at the runtime depending on the value included in the library (which is much more secure than having a list of enabled options embedded in a library).
Another thing to mention, in my instance, no trace of Enterprise Edition nor Express and Personal Edition, even if they are coded in GV$INSTANCE view’s code.
UPDATE: It seems that Stefan Koehler (@OracleSK) has the same conclusion but using another method:
Like this:
Like Loading...
Related