随笔-8  评论-0  文章-0  trackbacks-0
  2012年3月21日

前几天看了《程序员的自我修养——链接、装载与库》中的第二章“编译和链接”,主要根据其中的内容简单总结一下C程序编译的过程吧。

我现在一般都是用gcc,所以自然以GCC编译hellworld为例,简单总结如下。

hello.c源代码如下:

 #include <stdio.h>
 
int main()
 {
     printf(“Hello, world.\n”);
    
return 0;
 }

通常我们使用gcc来生成可执行程序,命令为:gcc hello.c,默认生成可执行文件a.out


其实编译(包括链接)的命令:gcc hello.c 可分解为如下4个大的步骤:

  • 预处理(Preprocessing)
  • 编译(Compilation)
  • 汇编(Assembly)
  • 链接(Linking)


1. 预处理(Preproceessing)

预处理的过程主要处理包括以下过程:
将所有的#define删除,并且展开所有的宏定义
处理所有的条件预编译指令,比如#if #ifdef #elif #else #endif等
处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置。
删除所有注释 “//”和”/* */”.
添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
保留所有的#pragma编译器指令,因为编译器需要使用它们



通常使用以下命令来进行预处理:

gcc -E hello.c -o hello.i

参数-E表示只进行预处理 或者也可以使用以下指令完成预处理过程

cpp hello.c > hello.i /* cpp – The C Preprocessor */

直接cat hello.i 你就可以看到预处理后的代码



2. 编译(Compilation)

编译过程就是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后生成相应的汇编代码。

$gcc –S hello.i –o hello.s

或者

$ /usr/lib/gcc/i486-linux-gnu/4.4/cc1 hello.c

注:现在版本的GCC把预处理和编译两个步骤合成一个步骤,用cc1工具来完成。gcc其实是后台程序的一些包装,根据不同参数去调用其他的实际处理程序,比如:预编译编译程序cc1、汇编器as、连接器ld

可以看到编译后的汇编代码(hello.s)如下:

.file "hello.c"
.section .rodata
.LC0:
.
string "Hello, world."
.text
.globl main
.type main, @function
main:
pushl 
%ebp
movl 
%esp, %ebp
andl $
-16%esp
subl $
16%esp
movl $.LC0, (
%esp)
call puts
movl $
0%eax
leave
ret
.size main, .
-main
.ident 
"GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU
-stack,"",@progbits
3.       汇编(Assembly)
汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。
$ gcc –c hello.c –o hello.o
或者
$ as hello.s –o hello.co
由于hello.o的内容为机器码,不能以普通文本形式的查看(vi 打开看到的是乱码)。
 
4.       链接(Linking)
通过调用链接器ld来链接程序运行需要的一大堆目标文件,以及所依赖的其它库文件,最后生成可执行文件。
ld -static crt1.o crti.o crtbeginT.o hello.o -start-group -lgcc -lgcc_eh -lc-end-group crtend.o crtn.o (省略了文件的路径名)。
 
helloworld的大体编译和链接过程就是这样了,那么编译器和链接器到底做了什么呢?
 
编译过程可分为6步:扫描(词法分析)、语法分析、语义分析、源代码优化、代码生成、目标代码优化。
词法分析:扫描器(Scanner)将源代的字符序列分割成一系列的记号(Token)。lex工具可实现词法扫描。
语法分析:语法分析器将记号(Token)产生语法树(Syntax Tree)。yacc工具可实现语法分析(yacc: Yet Another Compiler Compiler)。
语义分析:静态语义(在编译器可以确定的语义)、动态语义(只能在运行期才能确定的语义)。
源代码优化:源代码优化器(Source Code Optimizer),将整个语法书转化为中间代码(Intermediate Code)(中间代码是与目标机器和运行环境无关的)。中间代码使得编译器被分为前端和后端。编译器前端负责产生机器无关的中间代码;编译器后端将中间代 码转化为目标机器代码。
目标代码生成:代码生成器(Code Generator).
目标代码优化:目标代码优化器(Target Code Optimizer)。
 
链接的主要内容是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接。
链接的主要过程包括:地址和空间分配(Address and Storage Allocation),符号决议(Symbol Resolution),重定位(Relocation)等。
链接分为静态链接和动态链接。
静态链接是指在编译阶段直接把静态库加入到可执行文件中去,这样可执行文件会比较大。
而动态链接则是指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去。
静态链接的大致过程如下图所示:




posted @ 2012-03-21 16:52 cpp 阅读(222) | 评论 (0)编辑 收藏
  2012年3月20日

编译服务端程序,报错信息如下:
[oracle@informix ora]$ buildserver -o test -f test.c -f${ORACLE_HOME}/lib/libclntsh.so -s TEST
test.c: In function `TEST':
test.c:294: structure has no member named `sqlerrm'
test.c:295: structure has no member named `sqlerrm'
test.c:346: structure has no member named `sqlerrm'
test.c:347: structure has no member named `sqlerrm'
CMDTUX_CAT:1832: ERROR: can't execute cc -m32 -I$TUXDIR/include -o test BS-2557.c -L${TUXDIR}/lib test.c /u01/oracle/lib/libclntsh.so -ltux -lbuft -lfml -lfml32 -lengine -ldl -lpthread

【解决方法】
经过查找。原来是这个原因:
重命名下列文件,因为下列TUXEDO文件名与ORACLE带的文件名有冲突,所以要改名。
(1)TUXEDO安装路径include目录下的下面文件
把sqlca.h 改名为 sqlca.h.bbb
把sqlcode.h 改名为 sqlcode.h.bbb
把sqlda.h 改名为 sqlda.h.bbb
(2)重命名TUXEDO安装路径lib目录下的下面文件
把libsql.a 改名为 libsql.a.bbb
把libsql.so 改名为 libsql.so.bbb

希望对大家有用!



【报错信息】tmboot报错如下:
Booting admin processes ...

exec BBL -A :
process id=6993 ... Started.

Booting server processes ...

exec TMS_ORA -A :
Failed.
exec TMS_ORA -A :
Failed.
exec test -A :
Failed.
1 process started.

【查看日志】
查找ULOG和xa_NULL*.trc发现日值这样描述:
084519.6668.0:
xaogetmod: XAER_INVAL; Invalid xa_info string.

ORACLE XA: Version 10.2.0.1.0. RM name = 'Oracle_XA'.

【分析原因】
显然是我的ubb中的OPENINFO这行配置有问题。
查看我ubb配置如下:
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/tigger+SesTm=600+MaxCur=5+LogDir=.+DbgFl="

DbgFl不能等于空,要么指定数字,要么不写这个选项。
【解决问题】
修改ubb配置如下:
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/tigger+SesTm=600+MaxCur=5+LogDir=.+DbgFl=15"
或者
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/tigger+SesTm=600+MaxCur=5+LogDir=."

posted @ 2012-03-20 17:15 cpp 阅读(1873) | 评论 (0)编辑 收藏
我的系统环境:
1.LINUX:RHEL 5.0
2.ORACLE:10g
3.TUXEDO服务器和ORACLE服务器在同一台机器上

一、ORACLE配置

用sysdba帐户登陆,
SQL> conn / as sysdba
SQL> @$ORACLE_HOME/rdbms/admin/xaview.sql
DROP VIEW v$xatrans$
*
ERROR at line 1:
ORA-00942: table or view does not exist

DROP VIEW v$pending_xatrans$
*
ERROR at line 1:
ORA-00942: table or view does not exist

View created.
View created.

SQL> grant select on v$xatrans$ to public with grant option;

Grant succeeded.

SQL> grant select on v$pending_xatrans$ to public with grant option;

Grant succeeded.

SQL> grant select any table to public;

Grant succeeded.

二、TUXEDO的配置

1、修改$TUXDIR/udataobj/RM文件
把原来的以Oracle_XA:xaosw:开头的屏蔽掉、
添加Oracle_XA:xaosw:-L${ORACLE_HOME}/lib -lclntsh

2、创建TMS文件:TMS_ORA10g,TUXEDO通过TMS_ORA10g与ORACLE数据库采用XA协议进行通讯

buildtms -o $TUXDIR\bin\TMS_ORA10g -r Oracle_XA

这个地方要注意权限问题。
[tuxedo@brady udataobj]$ buildtms -o $TUXDIR/bin/TMS_ORA10g -r Oracle_XA
/usr/bin/ld: cannot find -lclntsh
collect2: ld returned 1 exit status
CMDTUX_CAT:1832: ERROR: can't execute cc -I$TUXDIR/include -o /home/tuxedo/beahome/tuxedo9.1/bin/TMS_ORA10g BS-124c.c -L${TUXDIR}/lib

/home/tuxedo/beahome/tuxedo9.1/lib/TMS.o -ltux -lbuft -L${ORACLE_HOME}/lib -lclntsh -lfml -lfml32 -lengine -ldl -lpthread /usr/lib/libcrypt.a
CMDTUX_CAT:530: ERROR: Cannot execute $TUXDIR/bin/buildserver -r Oracle_XA -o /home/tuxedo/beahome/tuxedo9.1/bin/TMS_ORA10g -S -s TMS -s..TMS:TMS -f
$TUXDIR/lib/TMS.o
我觉得写得没错,指定了库的路径,不应该出这个问题。
但是
[tuxedo@brady udataobj]$ ll $ORACLE_HOME/lib/libclntsh.so
ls: /home/oracle/oracle/product/10.2.0/db_1/lib/libclntsh.so: Permission denied
这时我才意识到 我的tuxedo用户没有权限啊。
于是用root用户来进行操作。
[root@brady tuxedo9.1]# buildtms -o $TUXDIR/bin/TMS_ORA10g -r Oracle_XA

3、配置UBBCONFIG文件
下面是我的配置文件,粗体部分是需要关注的位置。
*RESOURCES
IPCKEY 56778

DOMAINID xaapp
MASTER xamh
MAXACCESSERS 10
MAXSERVERS 5
MAXSERVICES 10
MODEL SHM
LDBAL N

*MACHINES
"brady.domain" LMID=xamh
APPDIR="/home/tuxedo/beahome/appdir/xaapp"
TUXCONFIG="/home/tuxedo/beahome/appdir/xaapp/tuxconfig"
TUXDIR="/home/tuxedo/beahome/tuxedo9.1"
TLOGDEVICE = "/home/tuxedo/beahome/appdir/TLOG"
TLOGNAME=TLOG
TLOGSIZE=100
#如果这个地方不设置的话,会出现一下错误:
#[tuxedo@brady xaapp]$ tmloadcf -y ubbconfig
#CMDTUX_CAT:1352: ERROR: GROUP entry GROUP1 has TMS specified and LMID xamh does not have TLOGDEVICE
#CMDTUX_CAT:867: ERROR: tmloadcf: Above errors found during syntax checking

*GROUPS
GROUP1
LMID=xamh
GRPNO=1
OPENINFO="ORACLE_XA:Oracle_XA+Acc=P/scott/tiger+sqlNet=ORCL+SesTm=100+LogDir=..+MaxCur=5"
CLOSEINFO=""
TMSNAME="TMS_ORA10g"
#OPENINFO中P/scott/tiger+sqlNet=ORCL
#scott/tiger是用户名/密码,sqlNet=ORCL是本地命名的服务别名
#需要根据实际情况自定义

*SERVERS
DEFAULT:
CLOPT="-A"

axserv SRVGRP=GROUP1 SRVID=1

*SERVICES
TEST
4、重命名下列文件,因为下列文件名与ORACLE带的文件名有冲突,所以要改名。
(1)TUXEDO安装路径include目录下的下面文件
把sqlca.h 改名为 sqlca.h.bbb
把sqlcode.h 改名为 sqlcode.h.bbb
把sqlda.h 改名为 sqlda.h.bbb
(2)重命名TUXEDO安装路径lib目录下的下面文件
把libsql.lib 改名为 libsql.lib.bbb

三、你可以编写服务器端和客户端程序了

注意:
1、在编译服务器端程序的时候,用到proc命令而且还有一些oracle的库,所以要注意权限问题。
2、在启动服务器之前,要确保ORACLE服务器已经启动,且监听器也已经正常启动。
我的Oracle数据库的监听器一开始没有正常启动,出现如下错误:
[root@brady xaapp]# tmboot -y
Booting all admin and server processes in /home/tuxedo/beahome/appdir/xaapp/tuxconfig
INFO: BEA Tuxedo, Version 9.1, 32-bit, Patch Level (none)
INFO: Serial #: 454493271161-2655514326743, Expiration NONE, Maxusers 1000000
INFO: Licensed to: Customer

Booting admin processes ...

exec BBL -A :
process id=5539 ... Started.

Booting server processes ...

exec TMS_ORA10g -A :
Failed.
exec TMS_ORA10g -A :
Failed.
exec TMS_ORA10g -A :
Failed.
exec axserv -A :
Failed.
1 process started.
在ULOG文件中记录的错误是TPERMERR - resource manager error

我弄了差不多一个小时,没有弄好,上网搜也没有没有搜到什么原因。
然后我检查了下oracle。才发现监听器没有正常启动。
[oracle@brady xa]$ lsnrctl stop
[oracle@brady xa]$ lsnrctl start
再次 启动TUXEDO服务器时:
[root@brady xaapp]# tmboot -y
Booting all admin and server processes in /home/tuxedo/beahome/appdir/xaapp/tuxconfig
INFO: BEA Tuxedo, Version 9.1, 32-bit, Patch Level (none)
INFO: Serial #: 454493271161-2655514326743, Expiration NONE, Maxusers 1000000
INFO: Licensed to: Customer

Booting admin processes ...

exec BBL -A :
process id=5603 ... Started.

Booting server processes ...

exec TMS_ORA10g -A :
CMDTUX_CAT:819: INFO: Process id=5606 Assume started (pipe).
exec TMS_ORA10g -A :
CMDTUX_CAT:819: INFO: Process id=5610 Assume started (pipe).
exec TMS_ORA10g -A :
CMDTUX_CAT:819: INFO: Process id=5613 Assume started (pipe).
exec axserv -A :
CMDTUX_CAT:819: INFO: Process id=5616 Assume started (pipe).
5 processes started.
posted @ 2012-03-20 15:20 cpp 阅读(2836) | 评论 (0)编辑 收藏
使用TUXEDO组件/DOMAINS时,需要对管理配置作一些改变。在以下例子中,会创建一个独立的测试应用环境(DOMAINID是TEST),它可以读取/请求另一个应用的交易(ProdCust)的数据。
服务GWTDOMAIN(GWT)负责响应域间通讯。GWADM和DMADM是处理管理交易和域服务的管理服务。这些服务必须配置在UBBCONFIG文件中。配置信息必须在远程和本地应用环境中定义。
服务GWTDOMAIN通过TCP/IP协议与其他域进行通讯。物理上远程的域的应用位置是透明的。
服务GWTDOMAIN是双向的:可以处理远程域发来的请求也可以向远程域发出请求。
除UBBCONFIG外,配置/DOMAINS还需要一些信息。这些信息在DMCONFIG文件中。DMCONFIG的文本文件通过BDMCONFIG编译成二进制文件。

过程
第一步:UBBCONFIG应作相应改动
为/DOMAIN建立的新组应该和其他应用组隔离开。其一用于管理,其他是网关服务。
UBBCONFIG
*RESOURCES
IPCKEY 49152
MAXACCESSERS 2
MAXSERVERS 25
MASTER SITE1
MODEL SHM
*MACHINES
class2 LMID=SITE1
TUXDIR=”/usr/tuxedo”
APPDIR=”/usr/apps/atmapp”
TUXCONFIG=”/usr/apps/atmapp/atmapp.tux”
*GROUPS
LDMGRP LMID=SITE1 GRPNO=20
LGWGRP LMID=SITE1 GRPNO=30
#下一行用于‘prod’域
APP1 LMID=SITE1 GRPNO=10
*SERVERS
DMADM SRVGRP=LDMGRP SRVID=200
GWADM SRVGRP=LGWGRP SRVID=310
GWTDOMAIN SRVGRP=LGWGRP SRVID=320
#下一行用于‘prod’域
CUSTOMER CLOPT=”-A” SRVGRP=APP1(对应上面的group) SRVID=100
*SERVICES
#下一行用于‘prod’域
ProdCust

第二步:为域间请求创建DMCONFIG
下文的ASCII数据存在的文件一般称为DMCONFIG,由此生成的二进制格式文件称为BDMCONFIG。以下的DMCONFIG存在于“TEST“域,用来请求远程的”prod“域的”ProdCust“交易。
DMCONFIG on TEST DOMAIN
*DM_LOCAL_DOMAINS
test GWGRP=LGWGRP
TYPE=TDOMAIN
DOMAINID=”TEST”
DMTLOGDEV=”/usr/apps/atmapp/logs/DLOG”
*DM_REMOTE_DOMAINS
production TYPE=TDOMAIN
DOMAINID=”prod”
*DM_TDOMAIN
prod NWADDR=”//lcspn1:3070”
NWDEVICE=”/dev/xti/tcp”
TEST NWADDR=”//lcspn2:3070”
NWDEVICE=”/dev/xti/tcp”
*DM_REMOTE_SERVICES
ProdCust
*DM_LOCAL_SERVICES
第三步:创建DMCONFIG指定对域外提供的交易
下文的DMCONFIG位于域’prod’,该域将向其他域提供可调用交易:ProdCust。
域‘prod’上的DMCONFIG
#本地域信息
*DM_LOCAL_DOMAINS
#LMID
production GWGRP=LGWGRP
#域描述:TDOMAIN即TUXEDO DOMAINS
TYPE=TDOMAIN
#域的唯一标识符
DOMAINID=”prod”
#交易的日志
DMTLOGDEV=”/usr/apps/atmapp/logs/DLOG”
#远程域信息
*DM_REMOTE_DOMAINS
test TYPE=TDOMAIN
DOMAINID=”TEST”
*DM_TDOMAIN
#地址和设备名
prod NWADDR=”//lcspn1:3070”
NWDEVICE=”/dev/xti/tcp”
TEST NWADDR=”//lcspn2:3070”
NWDEVICE=”/dev/xti/tcp”
*DM_REMOTE_SERVICES
*DM_LOCAL_SERVICES
#远程域可以使用的交易
ProdCust

第四步:设定环境变量
/DOMAIN进程需要额外的环境变量去访问/DOMAINS配置信息
export BDMCONFIG=/usr/apps/atmapp/atmapp.bdm

第五步:编译ubbconfig
本过程是从两个域中相同的UBBCONFIG生成二进制文件TUXCONFIG。在本例中,UBBCONFIG的信息位于’ubbconfig’。
tmloadcf –y ubbconfig
第六步:编译dmconfig
本过程是创建二进制DOMAINS配置文件,BDMCONFIG,在两个域中相同;而两者都有的文件‘dmconfig’内容是不同的。
dmloadcf –y dmconfig
posted @ 2012-03-20 15:18 cpp 阅读(510) | 评论 (0)编辑 收藏
系统说明
TUXEDO版本:9.0 安装目录 /opt/bea/tuxedo9.0
ORACLE版本:10.2.0.1 安装目录 /u01/app/oracle
一、Tuxedo 9 for AIX的安装
1、创建一个用户为Tuxedo,用户组为bea
2、创建/opt/bea为tuxedo的安装目录,
$mkdir /opt/bea
$chown tuxedo.bea /opt/bea
$chmod 770 /opt/bea
#bootinfo -k
64
$ sh tuxedo9_aix53_64.bin -i console
Preparing to install...
WARNING: /tmp does not have enough disk space!
Attempting to use /home/tuxedo for install base and tmp dir.
Extracting the JRE from the installer archive...
Unpacking the JRE...
Extracting the installation resources from the installer archive...
Configuring the installer for this system's environment...
Launching installer...
Preparing CONSOLE Mode Installation...
===============================================================================
Choose Locale...
----------------
->1- English
CHOOSE LOCALE BY NUMBER: 1
===============================================================================
(created with InstallAnywhere by Zero G)
-------------------------------------------------------------------------------


===============================================================================
Introduction
------------

BEA End User Clickwrap 001205
Copyright (c) BEA Systems, Inc.
All Rights Reserved.


DO YOU ACCEPT THE TERMS OF THIS LICENSE AGREEMENT? (Y/N): y

===============================================================================
Choose Install Set
------------------
Please choose the Install Set to be installed by this installer.
->1- Full Install
2- Server Install
3- Full Client Install
4- Jolt Client Install
5- ATMI Client Install
6- CORBA Client Install
7- Customize...
ENTER THE NUMBER FOR THE INSTALL SET, OR PRESS <ENTER> TO ACCEPT THE DEFAULT
: 1

===============================================================================
Choose BEA Home
---------------

1- Create new BEA Home
2- Use existing BEA Home
Enter a number: 2
1- /opt/bea
Existing BEA Home directory: 1

===============================================================================
Choose Product Directory
------------------------

1- Modify Current Selection (/opt/bea/tuxedo9.0)
2- Use Current Selection (/opt/bea/tuxedo9.0)
Enter a number: 2

===============================================================================
Pre-Installation Summary
------------------------
Please Review the Following Before Continuing:
Product Name:
Tuxedo 9.0
Install Folder:
/opt/bea/tuxedo9.0
Link Folder:
/home/tuxedo
Disk Space Information (for Installation Target):
Required: 386,803,702 bytes
Available: 2,625,392,640 bytes
PRESS <ENTER> TO CONTINUE:

===============================================================================
Ready To Install
----------------
InstallAnywhere is now ready to install Tuxedo 9.0 onto your system at the
following location:
/opt/bea/tuxedo9.0
PRESS <ENTER> TO INSTALL:

===============================================================================
Installing...
-------------
[==================|==================|==================|==================]
[------------------|------------------|------------------|------------------]

===============================================================================
Configure tlisten Service
-------------------------
Password: tuxedo
Verify Password: tuxedo
Password Accepted! Press "Enter" to continue.

===============================================================================
SSL Installation Choice.
------------------------
Would you like to install SSL Support?
->1- Yes
2- No
ENTER THE NUMBER FOR YOUR CHOICE, OR PRESS <ENTER> TO ACCEPT THE DEFAULT:
: 2


===============================================================================
License Installation Choice
---------------------------
Would you like to install your license now?
->1- Yes
2- No
ENTER THE NUMBER FOR YOUR CHOICE, OR PRESS <ENTER> TO ACCEPT THE DEFAULT:
: 2


===============================================================================
Installation Complete
---------------------
Congratulations. Tuxedo 9.0 has been successfully installed to:
/opt/bea/tuxedo9.0
PRESS <ENTER> TO EXIT THE INSTALLER:
安装完毕,需要把license文件重命名为lic.txt copy到$TUXDIR/udataobj/
二、TUxedo 9 连接 Oracle 10g配置
前提是在Tuxedo 9 上安装Oracle 10g client还有安装C编译器(不一定要用Visual Age C/C++ 7,这里我用的是pro c),设置Tuxedo用户能够通过sqlplus连接oracle数据库


1、ORACLE的的配置
sqlplus system@testcrm
SQL> @$ORACLE_HOME\rdbms\admin\xaview.sql
SQL>grant select on v$xatrans$ to public with grant option;
SQL>grant select on v$pending_xatrans$ to public with grant option;
SQL>grant select EMP to Scott
SQL>GRANT SELECT ON DBA_PENDING_TRANSACTIONS TO Scott;
注:scott默认为lock,需要用alter user scott account unlock,解锁。

2、设置Tuxedo用户的.profile文件
PATH=/usr/bin:/etc:/usr/sbin:/usr/ucb:$HOME/bin:/usr/bin/X11:/sbin:.TH=/usr/bin:/etc:/usr/sbin:/usr/ucb:$HOME/bin:/usr/bin
/X11:/sbin:.
TUXDIR=/opt/bea/tuxedo9.0
APPDIR=/opt/bea/tuxedo9.0/test

TUXCONFIG=$APPDIR/tuxconfig

CCOMP=/usr/vac/bin
PATH=$PATH:$TUXDIR/bin:$CCOMP
:$ORACLE_HOME/bin
export ORACLE_BASE=/home/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/client_1
export ORACLE_SID=ORCL
export ORACLE_TERM=vt100
export NLS_LANG="AMERICAN_America.ZHS16GBK"
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/network/lib:/usr/lib:$ORACLE_HOME/lib:$TUXDIR/lib
export PATH APPDIR TUXDIR TUXCONFIG CCOMP
if [ -s "$MAIL" ] # This is at Shell startup. In normal
then echo "$MAILMSG" # operation, the Shell checks
fi

3、修改$TUXDIR\udataobj目录下的RM文件
把以Oracle_XA:xaosw:开头的一行用#注释掉,并加入一行:
Oracle_XA:xaosw:-L${ORACLE_HOME}/lib ${ORACLE_HOME}/precomp/lib/cobsqlintf.o -lclntsh
注意空格
3、在TUXEDO用户下创建TMS文件:TMS_ORA10g,TUXEDO通过TMS_ORA10g与ORACLE数据库采用XA协议进行通讯
buildtms -o $TUXAPP/TMS_ORA10g -r Oracle_XA

4、配置 UBBCONFIG
#ghts Reserved.
#ident "@(#) samples/atmi/simpapp/ubbsimple $Revision: 1.5 $"
#Skeleton UBBCONFIG file for the TUXEDO Simple Application.
#Replace the <bracketed> items with the appropriate values.
*RESOURCES
IPCKEY 32770
#DOMAINID simpapp
MASTER simple
MAXACCESSERS 100
MAXSERVERS 50
MAXSERVICES 100
MODEL SHM
LDBAL N
*MACHINES
"Server" LMID=simple
APPDIR="/opt/bea/tuxedo9.0/test"
TUXCONFIG="/opt/bea/tuxedo9.0/test/tuxconfig"
TUXDIR="/opt/bea/tuxedo9.0"
TLOGDEVICE = "/opt/bea/tuxedo9.0/test/TLOG"
TLOGNAME=TLOG
TLOGSIZE=100
*GROUPS
GROUP1 LMID=simple GRPNO=1 OPENINFO="ORACLE_XA:Oracle_XA+Acc=P/scott/scott+sqlNet=ORCL+SesTm=100+LogDir=.+MaxCur=5"
TMSNAME="TMS_ORA10g" TMSCOUNT=2
*SERVERS
DEFAULT:
CLOPT="-A"
test SRVGRP=GROUP1 SRVID=1
*SERVICES
注意OPENINFO中P/scott/scott+sqlNet=ORCL需要根据实际情况自定义,还有机器名“server”,必须与uname -n显示的机器名一致
使用
$tmloadcf -y ubbsimple 生产TUXCONFIG文件


5、用TMADMIN创建TLOG文件,TUXEDO用一个文件TLOG记录对数据库操作的日志。用于协调分布式数据库的提交与回滚。
$tmadmin
>crdl -b 500 -z $TUXAPP/TLOG
>crlog -m simple
>q


6、重命名下列文件,因为下列文件名与ORACLE带的文件名有冲突
TUXEDO安装路径$TUXDIR/include目录下的下面文件
把sqlca.h 改名为 sqlca.h.bak
把sqlcode.h 改名为 sqlcode.h.bak
把sqlda.h 改名为 sqlda.h.bak


7、服务端的程序:test.pc,功能:根据客户端传的EMPNO到表EMP中取ENAME的值,并把它返回给客户端
编写客户端程序: testcli.c 功能:调用TUXEDO服务端的服务TEST,取EMPNO=7900所对应的ENAME的值,并显示出来
这里为没有写代码,因为我发现我到网搜索的测试代码都没法通过。
五、编译服务端程序
1.用ORACLE的PROC把test.pc 文件预编译成test.c文件
$ proc test.pc include=$TUXDIR\include
2.用buildserver把test.c编译成可执行文件,注意-r 后带的Oracle_XA 与RM文件中的一致。
$ buildserver -o test -f test.c -r Oracle_XA -s TEST
编译客户端程序
$ buildclient -o testcli -f testcli.c

8、用 tmboot –y 启动TUXEDO
应能看到所有的SERVER都启动成功。这时,我们的服务端程序test 会自动与ORACLE数据库建立连接,并一直保持这个连接,
直到TUXEDO系统或ORACLE数据库关闭。所以在我们的程序test.pc中看不到与数据库连接的语句,因为现在与数据库的连接由TUXEDO自动管理。
如果TMS_ORA10g启动失败会在当前目录生成一个*.trc文件,记录失败的原因,同时TUXEDO的ULOG文件中也会有一些错误信息。可参考这些错误信息进行错误分析。
$ tmboot -y
Booting all admin and server processes in /opt/bea/tuxedo9.0/test/tuxconfig
INFO: BEA Tuxedo, Version 9.0, 64-bit, Patch Level 002
INFO: Serial #: 454493271161-2143645176821, Expiration NONE, Maxusers 5
INFO: Licensed to: Shenzhen Edensoft Information
Booting admin processes ...
exec BBL -A :
process id=409822 ... Started.
Booting server processes ...
exec TMS_ORA10g -A :
process id=282686 ... Started.
exec TMS_ORA10g -A :
process id=401624 ... Started.
exec test -A :
process id=397522 ... Started.
4 processes started.

9、运行客户端程序
运行后应能看到服务端返回的结果。
$ testcli
如果编写的程序没有问题,就能返回值


posted @ 2012-03-20 15:15 cpp 阅读(421) | 评论 (0)编辑 收藏
最近一直在进行ORACLE 10g和PRO*C的学习。
其中遇到了不少的问题:
现列于此,已备他用。

[注:我的linux版本是RHEL 5,Oracle版本是10g]

1、在ORACLE 10g 安装准备的过程中:缺少libXp.so.6依赖
上网搜过不少文章,但是都不是很好的解决
我自己摸索出一个解决方法:
在RHEL5的安装盘中找到libXp-1.0.0-8.i386.rpm,进行安装后,便可解决。

2、在ORACLE 10g 安装过程中Xlib: connection to ":0.0" refused by server

Xlib: connection to ":0.0" refused by server
Xlib: No protocol specified
Error: Can't open display: :0.0

以root用户登陆,在shell中运行
[root@brady ~]# xhost local:oracle
non-network local connections being added to access control list
然后oracle身份就可以运行X程序了。

man xhost中有这样一段
A complete name has the syntax ‘‘family:name’’ where the families are as follows:
inet Internet host (IPv4)
inet6 Internet host (IPv6)
dnet DECnet host
nis Secure RPC network name
krb Kerberos V5 principal
local contains only one name, the empty string
si Server Interpreted

其中local那个是用来解决同一台机器的不同用户访问X的问题的。

3.proc: error while loading shared libraries: libclntsh.so.10.1:
cannot open shared object file: No such file or directory
解决方法:
在/etc/profile中添加
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:/usr/local/lib;
export LD_LIBRARY_PATH
然后可以用source /etc/profile 生效一下

4、PCC-S-02201错误

在用proc进行编译的时候(proc iname=test.pc) 出错
错误信息有很多:
PCC-S-02201, Encountered the symbol "<eof>;" when expecting one of the following....
发生 PCC-S-02201 错误时有两种解决办法:
1)升级编译器
2)修改$ORACLE_HOME/precomp/admin/pcscfg.cfg

  设置 parse=none

sys_include=(/app/oracle/product/db1/precomp/public,/usr/include,/usr/lib/gcc-lib/x86_64-redhat-linux/3.2.3/include,/usr/lib64/gcc-lib/x86_64-suse-linux/3.3.3/include,/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include,/usr/lib64/gcc/x86_64-suse-linux/4.1.0/include)
ltype
=short
define
=__x86_64__

更正后的命令:proc iname=test.pc parse=none
结果生成test.c文件

5、error: sqlca.h: No such file or directory

执行gcc -o test test.c时:
test.c:152:19: error: sqlca.h: No such file or directory
sqlca.h在$ORACLE_HOME/precomp/public/下
更正后的命令:gcc -o test test.c -I $ORACLE_HOME/precomp/public

6、undefined reference to `sqlcxt'

执行5中的命令时出现错误如下:
test.c:(.text+0x5e5): undefined reference to `sqlcxt'
需要用到$ORACLE_HOME/lib/libclntsh.so

故需加上 -L $ORACLE_HOME/lib -l clntsh
更正后的命令为:
gcc -o test test.c -I /home/oracle/oracle/product/10.2.0/db_1/precomp/public -L $ORACLE_HOME/lib -l clntsh
OK!至此编译成功!

但是这样写太麻烦

7、error while loading shared libraries: $ORACLE_HOME/lib/libnnz10.so:
cannot restore segment prot after reloc: Permission denied

执行程序(./test)时提示错误:
error while loading shared libraries: $ORACLE_HOME/lib/libnnz10.so:
cannot restore segment prot after reloc: Permission denied
相关的文章:
Topic:
Some Linux distributions with SELinux enabled may prevent IDL from running under the default security context. This TechTip is a workaround for CR#41937

Discussion:
Newer Linux distributions have enabled new kernel security extensions from the SELinux project at the NSA. These extensions allow finer-grained control over system security. However, SELinux also changes some default system behaviors, such as shared library loading, that can be problematic to third party programs.If you receive the error message "cannot restore segment prot after reloc: Permission denied" when launching IDL, then your SELinux configuration is preventing IDL from launching.

To rectify this issue, you can either:
(1)Change the default security context for IDL by issuing the command:
chcon -t texrel_shlib_t /usr/local/rsi/idl_6.1/bin/bin.linux.x86/*.so

(2)Disabling SELinux altogether by setting the line
SELINUX=disabled
in your /etc/sysconfig/selinux file.

我使用的解决办法:chcon -t texrel_shlib_t $ORACLE_HOME/lib/*.so
posted @ 2012-03-20 14:29 cpp 阅读(339) | 评论 (0)编辑 收藏
重编译dmconfig时报错:
dmloadcf dmconfig
Initialize BDMCONFIG file: /home/rpttest/etc/bdmconfig [y, q] ? y
CMDGW_CAT:1558: ERROR: Can't create _DM_RESOURCE_SECT
问题解决方法很简单,因为有个文件重复了,重编译没有自动更新机制,因此要手动删掉下述文件:
BDMCONFIG 然后再编译就行了。
posted @ 2012-03-20 13:13 cpp 阅读(682) | 评论 (0)编辑 收藏
1、gcc(gnu collect compiler)是一组编译工具的总称。它主要完成的工作任务是“预处理”和“编译”,以及提供了与编译器紧密相关的运行库的支持,如libgcc_s.so、libstdc++.so等。
2、binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编
(objdump)、elf结构分析工具(readelf)、无效调试信息和符号的工具(strip)等。通常,binutils与gcc是紧密相集成
的,没有binutils的话,gcc是不能正常工作的。
3、glibc是gnu发布的libc库,也即c运行库。glibc是linux系统中最底层的api(应用程序开发接口),几乎其它任何的运行
库都会倚赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现,主要的如下:
(1)string,字符串处理
(2)signal,信号处理
(3)dlfcn,管理共享库的动态加载
(4)direct,文件目录操作
(5)elf,共享库的动态加载器,也即interpreter
(6)iconv,不同字符集的编码转换
(7)inet,socket接口的实现
(8)intl,国际化,也即gettext的实现
(9)io
(10)linuxthreads
(11)locale,本地化
(12)login,虚拟终端设备的管理,及系统的安全访问
(13)malloc,动态内存的分配与管理
(14)nis
(15)stdlib,其它基本功能
二、在现有系统上如何升级(redhat9上实践的)
1、升级这些库时,最好不要覆盖系统中缺省的;因为这些库,尤其是glibc库,是系统中最核心的共享库和工具,如果盲目覆盖,很可能导致整个系
统瘫痪,因为一般更新glibc库时,其它所有以来libc库的共享库都需要重新被编译一遍。因此,为了调试某个程序进入glibc时,最好把glibc
安装到/usr/local/lib下。
2、首先编译glibc库。注意最好令建立一个glibc-build的目录,configure时加上--enable-add-ons=linuxthreads选项。make install安装到/usr/local下。
3、修改gcc的spec文件(/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/specs),更改ld-linux.so.2为/usr/local/lib下的新的共享库装载器。
4、编译binutils库,此时被编译出的程序会连接到/usr/local/lib下的新的libc库。注意,在configure前,需要设置ld缺省连接的路径(LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib),否则binutils会
configure出错,找不到libc中的一些符号。具体步骤如下:
(1)export LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib
(2)mkdir binutils-build && cd binutils-build
(3)../binutils-2.13.90.0.18/configure
(4)make(5)make -C ld clean
(6)make -C ld LIB_PATH=/usr/lib:/lib:/usr/local/bin(设置编译后的ld的缺省库搜索路径,后面的比前面的优先级高)
(7)make install
三、总结
1、运行时,动态库的装载依赖于ld-linux.so.6的实现,它查找共享库的顺序如下:
(1)ld-linux.so.6在可执行的目标文件中被指定,可用readelf命令查看
(2)ld-linux.so.6缺省在/usr/lib和lib中搜索;当glibc安装到/usr/local下时,它查找/usr/local/lib
(3)LD_LIBRARY_PATH环境变量中所设定的路径
(4)/etc/ld.so.conf(或/usr/local/etc/ld.so.conf)中所指定的路径,由ldconfig生成二进制的ld.so.cache中
2、编译时,搜索库的路径顺序如下:
(1)ld-linux.so.6由gcc的spec文件中所设定
(2)gcc --print-search-dirs所打印出的路径,主要是libgcc_s.so等库。可以通过GCC_EXEC_PREFIX来设定
(3)LIBRARY_PATH环境变量中所设定的路径,或编译的命令行中指定的-L/usr/local/lib
(2)binutils中的ld所设定的缺省搜索路径顺序,编译binutils时指定。(可以通过“ld --verbose | grep SEARCH”来查看)
3、二进制程序的搜索路径顺序为PATH环境变量中所设定。一般/usr/local/bin高于/usr/bin
4、编译时的头文件的搜索路径顺序,与library的查找顺序类似。一般/usr/local/include高于/usr/include
posted @ 2012-03-20 09:15 cpp 阅读(211) | 评论 (0)编辑 收藏
仅列出标题