﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-soak</title><link>http://www.cppblog.com/soak/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 23:07:13 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 23:07:13 GMT</pubDate><ttl>60</ttl><item><title>C程序编译过程浅析</title><link>http://www.cppblog.com/soak/archive/2012/03/21/168517.html</link><dc:creator>cpp</dc:creator><author>cpp</author><pubDate>Wed, 21 Mar 2012 08:52:00 GMT</pubDate><guid>http://www.cppblog.com/soak/archive/2012/03/21/168517.html</guid><wfw:comment>http://www.cppblog.com/soak/comments/168517.html</wfw:comment><comments>http://www.cppblog.com/soak/archive/2012/03/21/168517.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/soak/comments/commentRss/168517.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/soak/services/trackbacks/168517.html</trackback:ping><description><![CDATA[<div><p>前几天看了《程序员的自我修养&#8212;&#8212;链接、装载与库》中的第二章&#8220;编译和链接&#8221;，主要根据其中的内容简单总结一下C程序编译的过程吧。<br /><br /> </p><p>我现在一般都是用gcc，所以自然以GCC编译hellworld为例，简单总结如下。<br /></p> <p>hello.c源代码如下：</p><div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #000000;">&nbsp;#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br />&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&#8220;Hello,&nbsp;world.\n&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span>&nbsp;<span style="color: #000000;">0</span><span style="color: #000000;">;<br />&nbsp;}</span></div><p>通常我们使用gcc来生成可执行程序，命令为：gcc hello.c，默认生成可执行文件a.out</p> <p><br />其实编译（包括链接）的命令：gcc hello.c 可分解为如下4个大的步骤：</p> <ul><li>预处理(Preprocessing)</li><li>编译(Compilation)</li><li>汇编(Assembly)</li><li>链接(Linking)</li></ul><img alt="" src="http://www.cppblog.com/images/cppblog_com/soak/gcc_compilation.png" /><br /><p><br /></p><p>1. 预处理(Preproceessing)<br /><br />预处理的过程主要处理包括以下过程：<br />将所有的#define删除，并且展开所有的宏定义<br />处理所有的条件预编译指令，比如#if #ifdef #elif #else #endif等<br />处理#include 预编译指令，将被包含的文件插入到该预编译指令的位置。<br />删除所有注释 &#8220;//&#8221;和&#8221;/* */&#8221;.<br />添加行号和文件标识，以便编译时产生调试用的行号及编译错误警告行号。<br />保留所有的#pragma编译器指令，因为编译器需要使用它们<br /><br /><br /><br />通常使用以下命令来进行预处理：<br /><br />gcc -E hello.c -o hello.i<br /><br />参数-E表示只进行预处理 或者也可以使用以下指令完成预处理过程<br /><br />cpp hello.c &gt; hello.i /* cpp &#8211; The C Preprocessor */<br /><br />直接cat hello.i 你就可以看到预处理后的代码<br /><br /><br /><br />2. 编译(Compilation)<br /><br />编译过程就是把预处理完的文件进行一系列的词法分析，语法分析，语义分析及优化后生成相应的汇编代码。<br /><br />$gcc &#8211;S hello.i &#8211;o hello.s<br /><br />或者<br /><br />$ /usr/lib/gcc/i486-linux-gnu/4.4/cc1 hello.c<br /><br />注：现在版本的GCC把预处理和编译两个步骤合成一个步骤，用cc1工具来完成。gcc其实是后台程序的一些包装，根据不同参数去调用其他的实际处理程序，比如：预编译编译程序cc1、汇编器as、连接器ld<br /><br />可以看到编译后的汇编代码(hello.s)如下：</p><div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #000000;">.file&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">hello.c</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />.section&nbsp;.rodata<br />.LC0:<br />.</span><span style="color: #0000ff;">string</span>&nbsp;<span style="color: #000000;">"</span><span style="color: #000000;">Hello,&nbsp;world.</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />.text<br />.globl&nbsp;main<br />.type&nbsp;main,&nbsp;@function<br />main:<br />pushl&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">ebp<br />movl&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">esp,&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">ebp<br />andl&nbsp;$</span><span style="color: #000000;">-</span><span style="color: #000000;">16</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">esp<br />subl&nbsp;$</span><span style="color: #000000;">16</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">esp<br />movl&nbsp;$.LC0,&nbsp;(</span><span style="color: #000000;">%</span><span style="color: #000000;">esp)<br />call&nbsp;puts<br />movl&nbsp;$</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">eax<br />leave<br />ret<br />.size&nbsp;main,&nbsp;.</span><span style="color: #000000;">-</span><span style="color: #000000;">main<br />.ident&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">GCC:&nbsp;(Ubuntu&nbsp;4.4.3-4ubuntu5)&nbsp;4.4.3</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />.section&nbsp;.note.GNU</span><span style="color: #000000;">-</span><span style="color: #000000;">stack,</span><span style="color: #000000;">""</span><span style="color: #000000;">,@progbits</span></div><div></div><div>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 汇编(Assembly)</div> <div>汇编器是将汇编代码转变成机器可以执行的命令，每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单，根据汇编指令和机器指令的对照表一一翻译即可。</div> <div>$ gcc &#8211;c hello.c &#8211;o hello.o</div> <div>或者</div> <div>$ as hello.s &#8211;o hello.co</div> <div>由于hello.o的内容为机器码，不能以普通文本形式的查看（vi 打开看到的是乱码）。</div> <div>&nbsp;</div> <div>4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 链接(Linking)</div> <div>通过调用链接器ld来链接程序运行需要的一大堆目标文件，以及所依赖的其它库文件，最后生成可执行文件。</div> <div>ld -static crt1.o crti.o crtbeginT.o hello.o -start-group -lgcc -lgcc_eh -lc-end-group crtend.o crtn.o (省略了文件的路径名)。</div> <div>&nbsp;</div> <div>helloworld的大体编译和链接过程就是这样了，那么编译器和链接器到底做了什么呢？</div> <div>&nbsp;</div> <div>编译过程可分为6步：扫描（词法分析）、语法分析、语义分析、源代码优化、代码生成、目标代码优化。</div> <div>词法分析：扫描器（Scanner）将源代的字符序列分割成一系列的记号（Token）。lex工具可实现词法扫描。</div> <div>语法分析：语法分析器将记号（Token）产生语法树（Syntax Tree）。yacc工具可实现语法分析(yacc: Yet Another Compiler Compiler)。</div> <div>语义分析：静态语义（在编译器可以确定的语义）、动态语义（只能在运行期才能确定的语义）。</div> <div>源代码优化：源代码优化器(Source Code Optimizer)，将整个语法书转化为中间代码（Intermediate Code）（中间代码是与目标机器和运行环境无关的）。中间代码使得编译器被分为前端和后端。编译器前端负责产生机器无关的中间代码；编译器后端将中间代 码转化为目标机器代码。</div> <div>目标代码生成：代码生成器(Code Generator).</div> <div>目标代码优化：目标代码优化器(Target Code Optimizer)。</div> <div>&nbsp;</div> <div>链接的主要内容是把各个模块之间相互引用的部分处理好，使得各个模块之间能够正确地衔接。</div> <div>链接的主要过程包括：地址和空间分配（Address and Storage Allocation），符号决议（Symbol Resolution），重定位（Relocation）等。</div> <div>链接分为静态链接和动态链接。</div> <div>静态链接是指在编译阶段直接把静态库加入到可执行文件中去，这样可执行文件会比较大。</div> <div>而动态链接则是指链接阶段仅仅只加入一些描述信息，而程序执行时再从系统中把相应动态库加载到内存中去。</div> <div>静态链接的大致过程如下图所示：<br /><img alt="" src="http://www.cppblog.com/images/cppblog_com/soak/static_linking.png" /></div><p><br /></p><p><br /></p><p><br /></p></div><img src ="http://www.cppblog.com/soak/aggbug/168517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/soak/" target="_blank">cpp</a> 2012-03-21 16:52 <a href="http://www.cppblog.com/soak/archive/2012/03/21/168517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tuxedo连接数据库bug解决</title><link>http://www.cppblog.com/soak/archive/2012/03/20/168417.html</link><dc:creator>cpp</dc:creator><author>cpp</author><pubDate>Tue, 20 Mar 2012 09:15:00 GMT</pubDate><guid>http://www.cppblog.com/soak/archive/2012/03/20/168417.html</guid><wfw:comment>http://www.cppblog.com/soak/comments/168417.html</wfw:comment><comments>http://www.cppblog.com/soak/archive/2012/03/20/168417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/soak/comments/commentRss/168417.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/soak/services/trackbacks/168417.html</trackback:ping><description><![CDATA[<br />
编译服务端程序，报错信息如下：<br />
[oracle@informix ora]$ buildserver -o test -f test.c -f${ORACLE_HOME}/lib/libclntsh.so -s TEST<br />
test.c: In function `TEST':<br />
test.c:294: structure has no member named `sqlerrm'<br />
test.c:295: structure has no member named `sqlerrm'<br />
test.c:346: structure has no member named `sqlerrm'<br />
test.c:347: structure has no member named `sqlerrm'<br />
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  <br />
<br />
【解决方法】<br />
经过查找。原来是这个原因：<br />
重命名下列文件，因为下列TUXEDO文件名与ORACLE带的文件名有冲突，所以要改名。 <br />
（1）TUXEDO安装路径include目录下的下面文件 <br />
把sqlca.h 改名为 sqlca.h.bbb <br />
把sqlcode.h 改名为 sqlcode.h.bbb <br />
把sqlda.h 改名为 sqlda.h.bbb <br />
（2）重命名TUXEDO安装路径lib目录下的下面文件 <br />
把libsql.a 改名为 libsql.a.bbb <br />
把libsql.so 改名为 libsql.so.bbb <br />
<br />
<p>
希望对大家有用！<br />
</p>
<p><br />
</p>
<p><br />
</p>
<p>【报错信息】tmboot报错如下：<br />
Booting admin processes ...<br />
<br />
exec BBL -A :<br />
process id=6993 ... Started.<br />
<br />
Booting server processes ...<br />
<br />
exec TMS_ORA -A :<br />
Failed.<br />
exec TMS_ORA -A :<br />
Failed.<br />
exec test -A :<br />
Failed.<br />
1 process started.<br />
<br />
【查看日志】<br />
查找ULOG和xa_NULL*.trc发现日值这样描述：<br />
084519.6668.0:<br />
xaogetmod: XAER_INVAL; Invalid xa_info string.<br />
<br />
ORACLE XA: Version 10.2.0.1.0. RM name = 'Oracle_XA'.<br />
<br />
【分析原因】<br />
显然是我的ubb中的OPENINFO这行配置有问题。<br />
查看我ubb配置如下：<br />
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/tigger+SesTm=600+MaxCur=5+LogDir=.+DbgFl=" <br />
<br />
DbgFl不能等于空，要么指定数字，要么不写这个选项。<br />
【解决问题】<br />
修改ubb配置如下：<br />
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/tigger+SesTm=600+MaxCur=5+LogDir=.+DbgFl=15" <br />
或者<br />
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/tigger+SesTm=600+MaxCur=5+LogDir=."<br />
</p>
<img src ="http://www.cppblog.com/soak/aggbug/168417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/soak/" target="_blank">cpp</a> 2012-03-20 17:15 <a href="http://www.cppblog.com/soak/archive/2012/03/20/168417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tuxedo通过XA接口与Oracle数据库互联</title><link>http://www.cppblog.com/soak/archive/2012/03/20/168401.html</link><dc:creator>cpp</dc:creator><author>cpp</author><pubDate>Tue, 20 Mar 2012 07:20:00 GMT</pubDate><guid>http://www.cppblog.com/soak/archive/2012/03/20/168401.html</guid><wfw:comment>http://www.cppblog.com/soak/comments/168401.html</wfw:comment><comments>http://www.cppblog.com/soak/archive/2012/03/20/168401.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/soak/comments/commentRss/168401.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/soak/services/trackbacks/168401.html</trackback:ping><description><![CDATA[我的系统环境：<br />
1.LINUX：RHEL 5.0<br />
2.ORACLE：10g<br />
3.TUXEDO服务器和ORACLE服务器在同一台机器上<br />
<br />
一、ORACLE配置<br />
<br />
用sysdba帐户登陆，<br />
SQL&gt; conn / as sysdba<br />
SQL&gt; @$ORACLE_HOME/rdbms/admin/xaview.sql<br />
DROP VIEW v$xatrans$<br />
*<br />
ERROR at line 1:<br />
ORA-00942: table or view does not exist<br />
<br />
DROP VIEW v$pending_xatrans$<br />
*<br />
ERROR at line 1:<br />
ORA-00942: table or view does not exist<br />
<br />
View created.<br />
View created.<br />
<br />
SQL&gt; grant select on v$xatrans$ to public with grant option;<br />
<br />
Grant succeeded.<br />
<br />
SQL&gt; grant select on v$pending_xatrans$ to public with grant option;<br />
<br />
Grant succeeded.<br />
<br />
SQL&gt; grant select any table to public;<br />
<br />
Grant succeeded.<br />
<br />
二、TUXEDO的配置<br />
<br />
1、修改$TUXDIR/udataobj/RM文件<br />
把原来的以Oracle_XA:xaosw:开头的屏蔽掉、<br />
添加Oracle_XA:xaosw:-L${ORACLE_HOME}/lib -lclntsh<br />
<br />
2、创建TMS文件:TMS_ORA10g，TUXEDO通过TMS_ORA10g与ORACLE数据库采用XA协议进行通讯 <br />
<br />
buildtms -o $TUXDIR\bin\TMS_ORA10g -r Oracle_XA<br />
<br />
这个地方要注意权限问题。<br />
[tuxedo@brady udataobj]$ buildtms -o $TUXDIR/bin/TMS_ORA10g -r Oracle_XA<br />
/usr/bin/ld: cannot find -lclntsh<br />
collect2: ld returned 1 exit status<br />
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 <br />
<br />
/home/tuxedo/beahome/tuxedo9.1/lib/TMS.o -ltux -lbuft -L${ORACLE_HOME}/lib -lclntsh -lfml -lfml32 -lengine -ldl -lpthread /usr/lib/libcrypt.a <br />
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 <br />
$TUXDIR/lib/TMS.o <br />
我觉得写得没错，指定了库的路径，不应该出这个问题。<br />
但是<br />
[tuxedo@brady udataobj]$ ll $ORACLE_HOME/lib/libclntsh.so<br />
ls: /home/oracle/oracle/product/10.2.0/db_1/lib/libclntsh.so: Permission denied<br />
这时我才意识到 我的tuxedo用户没有权限啊。<br />
于是用root用户来进行操作。<br />
[root@brady tuxedo9.1]# buildtms -o $TUXDIR/bin/TMS_ORA10g -r Oracle_XA<br />
<br />
3、配置UBBCONFIG文件<br />
下面是我的配置文件，粗体部分是需要关注的位置。<br />
*RESOURCES<br />
IPCKEY          56778<br />
<br />
DOMAINID        xaapp<br />
MASTER          xamh<br />
MAXACCESSERS    10<br />
MAXSERVERS      5<br />
MAXSERVICES     10<br />
MODEL           SHM<br />
LDBAL           N<br />
<br />
*MACHINES<br />
"brady.domain" LMID=xamh<br />
APPDIR="/home/tuxedo/beahome/appdir/xaapp"<br />
TUXCONFIG="/home/tuxedo/beahome/appdir/xaapp/tuxconfig"<br />
TUXDIR="/home/tuxedo/beahome/tuxedo9.1"<br />
TLOGDEVICE = "/home/tuxedo/beahome/appdir/TLOG"<br />
TLOGNAME=TLOG<br />
TLOGSIZE=100<br />
#如果这个地方不设置的话，会出现一下错误：<br />
#[tuxedo@brady xaapp]$ tmloadcf -y ubbconfig<br />
#CMDTUX_CAT:1352: ERROR: GROUP entry GROUP1 has TMS specified and LMID xamh does not have TLOGDEVICE<br />
#CMDTUX_CAT:867: ERROR: tmloadcf: Above errors found during syntax checking<br />
<br />
*GROUPS<br />
GROUP1<br />
LMID=xamh<br />
GRPNO=1<br />
OPENINFO="ORACLE_XA:Oracle_XA+Acc=P/scott/tiger+sqlNet=ORCL+SesTm=100+LogDir=..+MaxCur=5"<br />
CLOSEINFO=""<br />
TMSNAME="TMS_ORA10g"<br />
#OPENINFO中P/scott/tiger+sqlNet=ORCL<br />
#scott/tiger是用户名/密码,sqlNet=ORCL是本地命名的服务别名<br />
#需要根据实际情况自定义<br />
<br />
*SERVERS<br />
DEFAULT:<br />
CLOPT="-A"<br />
<br />
axserv SRVGRP=GROUP1 SRVID=1<br />
<br />
*SERVICES<br />
TEST<br />
4、重命名下列文件，因为下列文件名与ORACLE带的文件名有冲突，所以要改名。 <br />
（1）TUXEDO安装路径include目录下的下面文件 <br />
把sqlca.h 改名为 sqlca.h.bbb <br />
把sqlcode.h 改名为 sqlcode.h.bbb <br />
把sqlda.h 改名为 sqlda.h.bbb <br />
（2）重命名TUXEDO安装路径lib目录下的下面文件 <br />
把libsql.lib 改名为 libsql.lib.bbb <br />
<br />
三、你可以编写服务器端和客户端程序了<br />
<br />
注意：<br />
1、在编译服务器端程序的时候，用到proc命令而且还有一些oracle的库，所以要注意权限问题。<br />
2、在启动服务器之前，要确保ORACLE服务器已经启动，且监听器也已经正常启动。<br />
我的Oracle数据库的监听器一开始没有正常启动，出现如下错误：<br />
[root@brady xaapp]# tmboot -y<br />
Booting all admin and server processes in /home/tuxedo/beahome/appdir/xaapp/tuxconfig<br />
INFO: BEA Tuxedo, Version 9.1, 32-bit, Patch Level (none)<br />
INFO: Serial #: 454493271161-2655514326743, Expiration NONE, Maxusers 1000000<br />
INFO: Licensed to: Customer<br />
<br />
Booting admin processes ...<br />
<br />
exec BBL -A :<br />
process id=5539 ... Started.<br />
<br />
Booting server processes ...<br />
<br />
exec TMS_ORA10g -A :<br />
Failed.<br />
exec TMS_ORA10g -A :<br />
Failed.<br />
exec TMS_ORA10g -A :<br />
Failed.<br />
exec axserv -A :<br />
Failed.<br />
1 process started.<br />
在ULOG文件中记录的错误是TPERMERR - resource manager error<br />
<br />
我弄了差不多一个小时，没有弄好，上网搜也没有没有搜到什么原因。<br />
然后我检查了下oracle。才发现监听器没有正常启动。<br />
[oracle@brady xa]$ lsnrctl stop<br />
[oracle@brady xa]$ lsnrctl start<br />
再次 启动TUXEDO服务器时：<br />
[root@brady xaapp]# tmboot -y<br />
Booting all admin and server processes in /home/tuxedo/beahome/appdir/xaapp/tuxconfig<br />
INFO: BEA Tuxedo, Version 9.1, 32-bit, Patch Level (none)<br />
INFO: Serial #: 454493271161-2655514326743, Expiration NONE, Maxusers 1000000<br />
INFO: Licensed to: Customer<br />
<br />
Booting admin processes ...<br />
<br />
exec BBL -A :<br />
process id=5603 ... Started.<br />
<br />
Booting server processes ...<br />
<br />
exec TMS_ORA10g -A :<br />
CMDTUX_CAT:819: INFO: Process id=5606 Assume started (pipe).<br />
exec TMS_ORA10g -A :<br />
CMDTUX_CAT:819: INFO: Process id=5610 Assume started (pipe).<br />
exec TMS_ORA10g -A :<br />
CMDTUX_CAT:819: INFO: Process id=5613 Assume started (pipe).<br />
exec axserv -A :<br />
CMDTUX_CAT:819: INFO: Process id=5616 Assume started (pipe).<br />
5 processes started.<br />
<img src ="http://www.cppblog.com/soak/aggbug/168401.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/soak/" target="_blank">cpp</a> 2012-03-20 15:20 <a href="http://www.cppblog.com/soak/archive/2012/03/20/168401.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tuxedo Domains通讯</title><link>http://www.cppblog.com/soak/archive/2012/03/20/168400.html</link><dc:creator>cpp</dc:creator><author>cpp</author><pubDate>Tue, 20 Mar 2012 07:18:00 GMT</pubDate><guid>http://www.cppblog.com/soak/archive/2012/03/20/168400.html</guid><wfw:comment>http://www.cppblog.com/soak/comments/168400.html</wfw:comment><comments>http://www.cppblog.com/soak/archive/2012/03/20/168400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/soak/comments/commentRss/168400.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/soak/services/trackbacks/168400.html</trackback:ping><description><![CDATA[使用TUXEDO组件/DOMAINS时，需要对管理配置作一些改变。在以下例子中，会创建一个独立的测试应用环境(DOMAINID是TEST)，它可以读取/请求另一个应用的交易（ProdCust）的数据。<br />
服务GWTDOMAIN(GWT)负责响应域间通讯。GWADM和DMADM是处理管理交易和域服务的管理服务。这些服务必须配置在UBBCONFIG文件中。配置信息必须在远程和本地应用环境中定义。<br />
服务GWTDOMAIN通过TCP/IP协议与其他域进行通讯。物理上远程的域的应用位置是透明的。<br />
服务GWTDOMAIN是双向的：可以处理远程域发来的请求也可以向远程域发出请求。<br />
除UBBCONFIG外，配置/DOMAINS还需要一些信息。这些信息在DMCONFIG文件中。DMCONFIG的文本文件通过BDMCONFIG编译成二进制文件。<br />
<br />
过程 <br />
第一步：UBBCONFIG应作相应改动<br />
为/DOMAIN建立的新组应该和其他应用组隔离开。其一用于管理，其他是网关服务。<br />
UBBCONFIG<br />
*RESOURCES<br />
IPCKEY                                 49152<br />
MAXACCESSERS 2<br />
MAXSERVERS                   25<br />
MASTER                               SITE1<br />
MODEL                                 SHM<br />
*MACHINES<br />
class2                                                LMID=SITE1<br />
TUXDIR=&#8221;/usr/tuxedo&#8221;<br />
APPDIR=&#8221;/usr/apps/atmapp&#8221;<br />
TUXCONFIG=&#8221;/usr/apps/atmapp/atmapp.tux&#8221;<br />
*GROUPS<br />
LDMGRP                              LMID=SITE1  GRPNO=20<br />
LGWGRP                              LMID=SITE1  GRPNO=30<br />
#下一行用于&#8216;prod&#8217;域<br />
APP1                                     LMID=SITE1 GRPNO=10<br />
*SERVERS<br />
DMADM                                SRVGRP=LDMGRP            SRVID=200<br />
GWADM                               SRVGRP=LGWGRP            SRVID=310<br />
GWTDOMAIN                       SRVGRP=LGWGRP            SRVID=320<br />
#下一行用于&#8216;prod&#8217;域<br />
CUSTOMER             CLOPT=&#8221;-A&#8221;  SRVGRP=APP1(对应上面的group)         SRVID=100<br />
*SERVICES<br />
#下一行用于&#8216;prod&#8217;域<br />
ProdCust<br />
<br />
第二步：为域间请求创建DMCONFIG<br />
下文的ASCII数据存在的文件一般称为DMCONFIG，由此生成的二进制格式文件称为BDMCONFIG。以下的DMCONFIG存在于&#8220;TEST&#8220;域，用来请求远程的&#8221;prod&#8220;域的&#8221;ProdCust&#8220;交易。<br />
DMCONFIG on TEST DOMAIN<br />
*DM_LOCAL_DOMAINS<br />
test                                  GWGRP=LGWGRP<br />
TYPE=TDOMAIN<br />
DOMAINID=&#8221;TEST&#8221;<br />
DMTLOGDEV=&#8221;/usr/apps/atmapp/logs/DLOG&#8221;<br />
*DM_REMOTE_DOMAINS<br />
production                  TYPE=TDOMAIN<br />
DOMAINID=&#8221;prod&#8221;<br />
*DM_TDOMAIN<br />
prod                            NWADDR=&#8221;//lcspn1:3070&#8221;<br />
NWDEVICE=&#8221;/dev/xti/tcp&#8221;<br />
TEST                          NWADDR=&#8221;//lcspn2:3070&#8221;<br />
NWDEVICE=&#8221;/dev/xti/tcp&#8221;<br />
*DM_REMOTE_SERVICES<br />
ProdCust<br />
*DM_LOCAL_SERVICES<br />
第三步：创建DMCONFIG指定对域外提供的交易<br />
下文的DMCONFIG位于域&#8217;prod&#8217;，该域将向其他域提供可调用交易：ProdCust。<br />
域&#8216;prod&#8217;上的DMCONFIG<br />
#本地域信息<br />
*DM_LOCAL_DOMAINS<br />
#LMID<br />
production                  GWGRP=LGWGRP<br />
#域描述：TDOMAIN即TUXEDO DOMAINS<br />
TYPE=TDOMAIN      <br />
#域的唯一标识符<br />
DOMAINID=&#8221;prod&#8221;<br />
#交易的日志<br />
DMTLOGDEV=&#8221;/usr/apps/atmapp/logs/DLOG&#8221;<br />
#远程域信息<br />
*DM_REMOTE_DOMAINS<br />
test                              TYPE=TDOMAIN<br />
DOMAINID=&#8221;TEST&#8221;<br />
*DM_TDOMAIN<br />
#地址和设备名<br />
prod                            NWADDR=&#8221;//lcspn1:3070&#8221;<br />
NWDEVICE=&#8221;/dev/xti/tcp&#8221;<br />
TEST                          NWADDR=&#8221;//lcspn2:3070&#8221;<br />
NWDEVICE=&#8221;/dev/xti/tcp&#8221;<br />
*DM_REMOTE_SERVICES<br />
*DM_LOCAL_SERVICES<br />
#远程域可以使用的交易<br />
ProdCust<br />
<br />
第四步：设定环境变量<br />
/DOMAIN进程需要额外的环境变量去访问/DOMAINS配置信息<br />
export BDMCONFIG=/usr/apps/atmapp/atmapp.bdm<br />
<br />
第五步：编译ubbconfig<br />
本过程是从两个域中相同的UBBCONFIG生成二进制文件TUXCONFIG。在本例中，UBBCONFIG的信息位于&#8217;ubbconfig&#8217;。<br />
tmloadcf &#8211;y ubbconfig<br />
第六步：编译dmconfig<br />
本过程是创建二进制DOMAINS配置文件，BDMCONFIG，在两个域中相同；而两者都有的文件&#8216;dmconfig&#8217;内容是不同的。<br />
dmloadcf &#8211;y dmconfig<br />
<img src ="http://www.cppblog.com/soak/aggbug/168400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/soak/" target="_blank">cpp</a> 2012-03-20 15:18 <a href="http://www.cppblog.com/soak/archive/2012/03/20/168400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tuxedo 9.0 for AIX与Oracle 10 XA连接</title><link>http://www.cppblog.com/soak/archive/2012/03/20/168399.html</link><dc:creator>cpp</dc:creator><author>cpp</author><pubDate>Tue, 20 Mar 2012 07:15:00 GMT</pubDate><guid>http://www.cppblog.com/soak/archive/2012/03/20/168399.html</guid><wfw:comment>http://www.cppblog.com/soak/comments/168399.html</wfw:comment><comments>http://www.cppblog.com/soak/archive/2012/03/20/168399.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/soak/comments/commentRss/168399.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/soak/services/trackbacks/168399.html</trackback:ping><description><![CDATA[系统说明<br />
TUXEDO版本:9.0 安装目录 /opt/bea/tuxedo9.0 <br />
ORACLE版本:10.2.0.1 安装目录 /u01/app/oracle<br />
一、Tuxedo 9 for AIX的安装<br />
1、创建一个用户为Tuxedo，用户组为bea<br />
2、创建/opt/bea为tuxedo的安装目录，<br />
$mkdir /opt/bea<br />
$chown tuxedo.bea /opt/bea<br />
$chmod 770 /opt/bea<br />
#bootinfo -k<br />
64<br />
$ sh tuxedo9_aix53_64.bin -i console<br />
Preparing to install...<br />
WARNING: /tmp does not have enough disk space!<br />
Attempting to use /home/tuxedo for install base and tmp dir.<br />
Extracting the JRE from the installer archive...<br />
Unpacking the JRE...<br />
Extracting the installation resources from the installer archive...<br />
Configuring the installer for this system's environment...<br />
Launching installer...<br />
Preparing CONSOLE Mode Installation...<br />
===============================================================================<br />
Choose Locale...<br />
----------------<br />
-&gt;1- English<br />
CHOOSE LOCALE BY NUMBER: 1<br />
===============================================================================<br />
(created with InstallAnywhere by Zero G)<br />
-------------------------------------------------------------------------------<br />
<br />
<br />
===============================================================================<br />
Introduction<br />
------------<br />
<br />
BEA End User Clickwrap 001205<br />
Copyright (c) BEA Systems, Inc.<br />
All Rights Reserved.<br />
<br />
<br />
DO YOU ACCEPT THE TERMS OF THIS LICENSE AGREEMENT? (Y/N): y<br />
<br />
===============================================================================<br />
Choose Install Set<br />
------------------<br />
Please choose the Install Set to be installed by this installer.<br />
-&gt;1- Full Install<br />
2- Server Install<br />
3- Full Client Install<br />
4- Jolt Client Install<br />
5- ATMI Client Install<br />
6- CORBA Client Install<br />
7- Customize...<br />
ENTER THE NUMBER FOR THE INSTALL SET, OR PRESS &lt;ENTER&gt; TO ACCEPT THE DEFAULT<br />
: 1<br />
<br />
===============================================================================<br />
Choose BEA Home<br />
---------------<br />
<br />
1- Create new BEA Home<br />
2- Use existing BEA Home<br />
Enter a number: 2<br />
1- /opt/bea<br />
Existing BEA Home directory: 1<br />
<br />
===============================================================================<br />
Choose Product Directory<br />
------------------------<br />
<br />
1- Modify Current Selection (/opt/bea/tuxedo9.0)<br />
2- Use Current Selection (/opt/bea/tuxedo9.0)<br />
Enter a number: 2<br />
<br />
===============================================================================<br />
Pre-Installation Summary<br />
------------------------<br />
Please Review the Following Before Continuing:<br />
Product Name:<br />
Tuxedo 9.0<br />
Install Folder:<br />
/opt/bea/tuxedo9.0<br />
Link Folder:<br />
/home/tuxedo<br />
Disk Space Information (for Installation Target): <br />
Required:  386,803,702 bytes<br />
Available: 2,625,392,640 bytes<br />
PRESS &lt;ENTER&gt; TO CONTINUE: <br />
<br />
===============================================================================<br />
Ready To Install<br />
----------------<br />
InstallAnywhere is now ready to install Tuxedo 9.0 onto your system at the <br />
following location:<br />
/opt/bea/tuxedo9.0<br />
PRESS &lt;ENTER&gt; TO INSTALL: <br />
<br />
===============================================================================<br />
Installing...<br />
-------------<br />
[==================|==================|==================|==================]<br />
[------------------|------------------|------------------|------------------]<br />
<br />
===============================================================================<br />
Configure tlisten Service<br />
-------------------------<br />
Password: tuxedo<br />
Verify Password: tuxedo<br />
Password Accepted! Press "Enter" to continue.<br />
<br />
===============================================================================<br />
SSL Installation Choice.<br />
------------------------<br />
Would you like to install SSL Support?<br />
-&gt;1- Yes<br />
2- No<br />
ENTER THE NUMBER FOR YOUR CHOICE, OR PRESS &lt;ENTER&gt; TO ACCEPT THE DEFAULT:<br />
: 2<br />
<br />
<br />
===============================================================================<br />
License Installation Choice<br />
---------------------------<br />
Would you like to install your license now?<br />
-&gt;1- Yes<br />
2- No<br />
ENTER THE NUMBER FOR YOUR CHOICE, OR PRESS &lt;ENTER&gt; TO ACCEPT THE DEFAULT:<br />
: 2<br />
<br />
<br />
===============================================================================<br />
Installation Complete<br />
---------------------<br />
Congratulations. Tuxedo 9.0 has been successfully installed to:<br />
/opt/bea/tuxedo9.0<br />
PRESS &lt;ENTER&gt; TO EXIT THE INSTALLER: <br />
安装完毕，需要把license文件重命名为lic.txt copy到$TUXDIR/udataobj/<br />
二、TUxedo 9 连接 Oracle 10g配置<br />
前提是在Tuxedo 9 上安装Oracle 10g client还有安装C编译器（不一定要用Visual Age C/C++ 7,这里我用的是pro c），设置Tuxedo用户能够通过sqlplus连接oracle数据库<br />
<br />
<br />
1、ORACLE的的配置<br />
sqlplus system@testcrm<br />
SQL&gt; @$ORACLE_HOME\rdbms\admin\xaview.sql<br />
SQL&gt;grant select on v$xatrans$ to public with grant option; <br />
SQL&gt;grant select on v$pending_xatrans$ to public with grant option; <br />
SQL&gt;grant select EMP to Scott<br />
SQL&gt;GRANT SELECT ON DBA_PENDING_TRANSACTIONS TO Scott;<br />
注：scott默认为lock，需要用alter user scott account unlock，解锁。<br />
<br />
2、设置Tuxedo用户的.profile文件<br />
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<br />
/X11:/sbin:.<br />
TUXDIR=/opt/bea/tuxedo9.0<br />
APPDIR=/opt/bea/tuxedo9.0/test<br />
<br />
TUXCONFIG=$APPDIR/tuxconfig<br />
<br />
CCOMP=/usr/vac/bin<br />
PATH=$PATH:$TUXDIR/bin:$CCOMP<br />
:$ORACLE_HOME/bin<br />
export ORACLE_BASE=/home/oracle<br />
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/client_1<br />
export ORACLE_SID=ORCL<br />
export ORACLE_TERM=vt100<br />
export NLS_LANG="AMERICAN_America.ZHS16GBK"<br />
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data<br />
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/network/lib:/usr/lib:$ORACLE_HOME/lib:$TUXDIR/lib<br />
export PATH APPDIR TUXDIR TUXCONFIG CCOMP<br />
if [ -s "$MAIL" ]           # This is at Shell startup.  In normal<br />
then echo "$MAILMSG"        # operation, the Shell checks<br />
fi  <br />
<br />
3、修改$TUXDIR\udataobj目录下的RM文件<br />
把以Oracle_XA:xaosw:开头的一行用#注释掉，并加入一行：<br />
Oracle_XA:xaosw:-L${ORACLE_HOME}/lib ${ORACLE_HOME}/precomp/lib/cobsqlintf.o -lclntsh <br />
注意空格<br />
3、在TUXEDO用户下创建TMS文件:TMS_ORA10g，TUXEDO通过TMS_ORA10g与ORACLE数据库采用XA协议进行通讯<br />
buildtms -o $TUXAPP/TMS_ORA10g -r Oracle_XA<br />
<br />
4、配置 UBBCONFIG<br />
#ghts Reserved.<br />
#ident  "@(#) samples/atmi/simpapp/ubbsimple    $Revision: 1.5 $"<br />
#Skeleton UBBCONFIG file for the TUXEDO Simple Application.<br />
#Replace the &lt;bracketed&gt; items with the appropriate values.<br />
*RESOURCES<br />
IPCKEY          32770<br />
#DOMAINID       simpapp<br />
MASTER          simple<br />
MAXACCESSERS    100<br />
MAXSERVERS      50<br />
MAXSERVICES     100<br />
MODEL           SHM<br />
LDBAL           N<br />
*MACHINES<br />
"Server" LMID=simple<br />
APPDIR="/opt/bea/tuxedo9.0/test"<br />
TUXCONFIG="/opt/bea/tuxedo9.0/test/tuxconfig"<br />
TUXDIR="/opt/bea/tuxedo9.0"<br />
TLOGDEVICE = "/opt/bea/tuxedo9.0/test/TLOG"<br />
TLOGNAME=TLOG<br />
TLOGSIZE=100<br />
*GROUPS<br />
GROUP1 LMID=simple GRPNO=1 OPENINFO="ORACLE_XA:Oracle_XA+Acc=P/scott/scott+sqlNet=ORCL+SesTm=100+LogDir=.+MaxCur=5"<br />
TMSNAME="TMS_ORA10g" TMSCOUNT=2<br />
*SERVERS<br />
DEFAULT:<br />
CLOPT="-A"<br />
test SRVGRP=GROUP1 SRVID=1<br />
*SERVICES<br />
注意OPENINFO中P/scott/scott+sqlNet=ORCL需要根据实际情况自定义,还有机器名&#8220;server&#8221;，必须与uname -n显示的机器名一致<br />
使用<br />
$tmloadcf -y ubbsimple 生产TUXCONFIG文件<br />
<br />
<br />
5、用TMADMIN创建TLOG文件，TUXEDO用一个文件TLOG记录对数据库操作的日志。用于协调分布式数据库的提交与回滚。<br />
$tmadmin<br />
&gt;crdl -b 500 -z $TUXAPP/TLOG<br />
&gt;crlog -m simple<br />
&gt;q<br />
<br />
<br />
6、重命名下列文件，因为下列文件名与ORACLE带的文件名有冲突<br />
TUXEDO安装路径$TUXDIR/include目录下的下面文件<br />
把sqlca.h 改名为 sqlca.h.bak<br />
把sqlcode.h 改名为 sqlcode.h.bak <br />
把sqlda.h 改名为 sqlda.h.bak<br />
<br />
<br />
7、服务端的程序：test.pc，功能:根据客户端传的EMPNO到表EMP中取ENAME的值，并把它返回给客户端<br />
编写客户端程序: testcli.c 功能:调用TUXEDO服务端的服务TEST，取EMPNO=7900所对应的ENAME的值，并显示出来<br />
这里为没有写代码，因为我发现我到网搜索的测试代码都没法通过。<br />
五、编译服务端程序<br />
1.用ORACLE的PROC把test.pc 文件预编译成test.c文件<br />
$ proc test.pc include=$TUXDIR\include<br />
2.用buildserver把test.c编译成可执行文件，注意-r 后带的Oracle_XA 与RM文件中的一致。<br />
$ buildserver -o test -f test.c -r Oracle_XA -s TEST<br />
编译客户端程序<br />
$ buildclient -o testcli -f testcli.c<br />
<br />
8、用 tmboot &#8211;y 启动TUXEDO<br />
应能看到所有的SERVER都启动成功。这时，我们的服务端程序test 会自动与ORACLE数据库建立连接，并一直保持这个连接，<br />
直到TUXEDO系统或ORACLE数据库关闭。所以在我们的程序test.pc中看不到与数据库连接的语句，因为现在与数据库的连接由TUXEDO自动管理。<br />
如果TMS_ORA10g启动失败会在当前目录生成一个*.trc文件，记录失败的原因，同时TUXEDO的ULOG文件中也会有一些错误信息。可参考这些错误信息进行错误分析。<br />
$ tmboot -y<br />
Booting all admin and server processes in /opt/bea/tuxedo9.0/test/tuxconfig<br />
INFO: BEA Tuxedo, Version 9.0, 64-bit, Patch Level 002<br />
INFO: Serial #: 454493271161-2143645176821, Expiration NONE, Maxusers 5<br />
INFO: Licensed to: Shenzhen Edensoft Information<br />
Booting admin processes ...<br />
exec BBL -A :<br />
process id=409822 ... Started.<br />
Booting server processes ...<br />
exec TMS_ORA10g -A :<br />
process id=282686 ... Started.<br />
exec TMS_ORA10g -A :<br />
process id=401624 ... Started.<br />
exec test -A :<br />
process id=397522 ... Started.<br />
4 processes started.<br />
<br />
9、运行客户端程序<br />
运行后应能看到服务端返回的结果。<br />
$ testcli<br />
如果编写的程序没有问题，就能返回值<br />
<br />
<br />
<img src ="http://www.cppblog.com/soak/aggbug/168399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/soak/" target="_blank">cpp</a> 2012-03-20 15:15 <a href="http://www.cppblog.com/soak/archive/2012/03/20/168399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 10g及pro*c相关问题及解决方法</title><link>http://www.cppblog.com/soak/archive/2012/03/20/168394.html</link><dc:creator>cpp</dc:creator><author>cpp</author><pubDate>Tue, 20 Mar 2012 06:29:00 GMT</pubDate><guid>http://www.cppblog.com/soak/archive/2012/03/20/168394.html</guid><wfw:comment>http://www.cppblog.com/soak/comments/168394.html</wfw:comment><comments>http://www.cppblog.com/soak/archive/2012/03/20/168394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/soak/comments/commentRss/168394.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/soak/services/trackbacks/168394.html</trackback:ping><description><![CDATA[最近一直在进行ORACLE 10g和PRO*C的学习。<br />
其中遇到了不少的问题：<br />
现列于此，已备他用。<br />
<br />
[注：我的linux版本是RHEL 5,Oracle版本是10g]<br />
<br />
1、在ORACLE 10g 安装准备的过程中：缺少libXp.so.6依赖<br />
上网搜过不少文章，但是都不是很好的解决<br />
我自己摸索出一个解决方法：<br />
在RHEL5的安装盘中找到libXp-1.0.0-8.i386.rpm，进行安装后，便可解决。<br />
<br />
2、在ORACLE 10g 安装过程中Xlib: connection to ":0.0" refused by server<br />
<br />
Xlib: connection to ":0.0" refused by server<br />
Xlib: No protocol specified<br />
Error: Can't open display: :0.0<br />
<br />
以root用户登陆，在shell中运行<br />
[root@brady ~]# xhost local:oracle<br />
non-network local connections being added to access control list<br />
然后oracle身份就可以运行X程序了。<br />
<br />
man xhost中有这样一段<br />
A complete name has the syntax &#8216;&#8216;family:name&#8217;&#8217; where the families are as follows:<br />
inet      Internet host (IPv4)<br />
inet6     Internet host (IPv6)<br />
dnet      DECnet host<br />
nis       Secure RPC network name<br />
krb       Kerberos V5 principal<br />
local     contains only one name, the empty string<br />
si        Server Interpreted<br />
<br />
其中local那个是用来解决同一台机器的不同用户访问X的问题的。<br />
<br />
3.proc: error while loading shared libraries: libclntsh.so.10.1: <br />
cannot open shared object file: No such file or directory<br />
解决方法：<br />
在/etc/profile中添加<br />
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:/usr/local/lib;<br />
export LD_LIBRARY_PATH<br />
然后可以用source /etc/profile 生效一下<br />
<br />
4、PCC-S-02201错误<br />
<br />
在用proc进行编译的时候（proc iname=test.pc） 出错<br />
错误信息有很多：<br />
PCC-S-02201, Encountered the symbol "&lt;eof&gt;;" when expecting one of the following....<br />
发生 PCC-S-02201 错误时有两种解决办法：<br />
1)升级编译器<br />
2)修改$ORACLE_HOME/precomp/admin/pcscfg.cfg<br />
<p>&#160;
设置 parse=none</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #000000; ">sys_include</span><span style="color: #000000; ">=</span><span style="color: #000000; ">(</span><span style="color: #000000; ">/</span><span style="color: #000000; ">app</span><span style="color: #000000; ">/</span><span style="color: #000000; ">oracle</span><span style="color: #000000; ">/</span><span style="color: #000000; ">product</span><span style="color: #000000; ">/</span><span style="color: #000000; ">db1</span><span style="color: #000000; ">/</span><span style="color: #000000; ">precomp</span><span style="color: #000000; ">/</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">,</span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">include,</span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">lib</span><span style="color: #000000; ">/</span><span style="color: #000000; ">gcc</span><span style="color: #000000; ">-</span><span style="color: #000000; ">lib</span><span style="color: #000000; ">/</span><span style="color: #000000; ">x86_64</span><span style="color: #000000; ">-</span><span style="color: #000000; ">redhat</span><span style="color: #000000; ">-</span><span style="color: #000000; ">linux</span><span style="color: #000000; ">/</span><span style="color: #000000; ">3.2</span><span style="color: #000000; ">.</span><span style="color: #000000; ">3</span><span style="color: #000000; ">/</span><span style="color: #000000; ">include,</span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">lib64</span><span style="color: #000000; ">/</span><span style="color: #000000; ">gcc</span><span style="color: #000000; ">-</span><span style="color: #000000; ">lib</span><span style="color: #000000; ">/</span><span style="color: #000000; ">x86_64</span><span style="color: #000000; ">-</span><span style="color: #000000; ">suse</span><span style="color: #000000; ">-</span><span style="color: #000000; ">linux</span><span style="color: #000000; ">/</span><span style="color: #000000; ">3.3</span><span style="color: #000000; ">.</span><span style="color: #000000; ">3</span><span style="color: #000000; ">/</span><span style="color: #000000; ">include,</span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">lib</span><span style="color: #000000; ">/</span><span style="color: #000000; ">gcc</span><span style="color: #000000; ">/</span><span style="color: #000000; ">x86_64</span><span style="color: #000000; ">-</span><span style="color: #000000; ">redhat</span><span style="color: #000000; ">-</span><span style="color: #000000; ">linux</span><span style="color: #000000; ">/</span><span style="color: #000000; ">4.1</span><span style="color: #000000; ">.</span><span style="color: #000000; ">1</span><span style="color: #000000; ">/</span><span style="color: #000000; ">include,</span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">lib64</span><span style="color: #000000; ">/</span><span style="color: #000000; ">gcc</span><span style="color: #000000; ">/</span><span style="color: #000000; ">x86_64</span><span style="color: #000000; ">-</span><span style="color: #000000; ">suse</span><span style="color: #000000; ">-</span><span style="color: #000000; ">linux</span><span style="color: #000000; ">/</span><span style="color: #000000; ">4.1</span><span style="color: #000000; ">.</span><span style="color: #000000; ">0</span><span style="color: #000000; ">/</span><span style="color: #000000; ">include)<br />
ltype</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">short</span><span style="color: #000000; "><br />
define</span><span style="color: #000000; ">=</span><span style="color: #000000; ">__x86_64__</span></div>
<br />
更正后的命令：proc iname=test.pc parse=none <br />
结果生成test.c文件<br />
<br />
5、error: sqlca.h: No such file or directory<br />
<br />
执行gcc -o test test.c时：<br />
test.c:152:19: error: sqlca.h: No such file or directory<br />
sqlca.h在$ORACLE_HOME/precomp/public/下<br />
更正后的命令：gcc -o test test.c -I $ORACLE_HOME/precomp/public<br />
<br />
6、undefined reference to `sqlcxt'<br />
<br />
执行5中的命令时出现错误如下：<br />
test.c:(.text+0x5e5): undefined reference to `sqlcxt'<br />
需要用到$ORACLE_HOME/lib/libclntsh.so<br />
<br />
故需加上 -L $ORACLE_HOME/lib -l clntsh<br />
更正后的命令为：<br />
gcc -o test test.c -I /home/oracle/oracle/product/10.2.0/db_1/precomp/public -L $ORACLE_HOME/lib -l clntsh<br />
OK!至此编译成功!<br />
<br />
但是这样写太麻烦<br />
<br />
7、error while loading shared libraries: $ORACLE_HOME/lib/libnnz10.so: <br />
cannot restore segment prot after reloc: Permission denied<br />
<br />
执行程序（./test）时提示错误：<br />
error while loading shared libraries: $ORACLE_HOME/lib/libnnz10.so: <br />
cannot restore segment prot after reloc: Permission denied<br />
相关的文章：<br />
Topic:<br />
Some Linux distributions with SELinux enabled may prevent IDL from running under the default security context. This TechTip is a workaround for CR#41937<br />
<br />
Discussion: <br />
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.<br />
<br />
To rectify this issue, you can either:<br />
（1）Change the default security context for IDL by issuing the command:<br />
chcon -t texrel_shlib_t /usr/local/rsi/idl_6.1/bin/bin.linux.x86/*.so<br />
<br />
（2）Disabling SELinux altogether by setting the line<br />
SELINUX=disabled<br />
in your /etc/sysconfig/selinux file.<br />
<br />
我使用的解决办法：chcon -t texrel_shlib_t $ORACLE_HOME/lib/*.so<br />
<img src ="http://www.cppblog.com/soak/aggbug/168394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/soak/" target="_blank">cpp</a> 2012-03-20 14:29 <a href="http://www.cppblog.com/soak/archive/2012/03/20/168394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dmconfig 错误</title><link>http://www.cppblog.com/soak/archive/2012/03/20/168384.html</link><dc:creator>cpp</dc:creator><author>cpp</author><pubDate>Tue, 20 Mar 2012 05:13:00 GMT</pubDate><guid>http://www.cppblog.com/soak/archive/2012/03/20/168384.html</guid><wfw:comment>http://www.cppblog.com/soak/comments/168384.html</wfw:comment><comments>http://www.cppblog.com/soak/archive/2012/03/20/168384.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/soak/comments/commentRss/168384.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/soak/services/trackbacks/168384.html</trackback:ping><description><![CDATA[重编译dmconfig时报错：<br />
dmloadcf dmconfig<br />
Initialize BDMCONFIG file: /home/rpttest/etc/bdmconfig [y, q] ? y<br />
CMDGW_CAT:1558: ERROR: Can't create _DM_RESOURCE_SECT<br />
问题解决方法很简单，因为有个文件重复了，重编译没有自动更新机制，因此要手动删掉下述文件：<br />
BDMCONFIG 然后再编译就行了。<br />
<img src ="http://www.cppblog.com/soak/aggbug/168384.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/soak/" target="_blank">cpp</a> 2012-03-20 13:13 <a href="http://www.cppblog.com/soak/archive/2012/03/20/168384.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于gcc、glibc和binutils模块之间的关系</title><link>http://www.cppblog.com/soak/archive/2012/03/20/168362.html</link><dc:creator>cpp</dc:creator><author>cpp</author><pubDate>Tue, 20 Mar 2012 01:15:00 GMT</pubDate><guid>http://www.cppblog.com/soak/archive/2012/03/20/168362.html</guid><wfw:comment>http://www.cppblog.com/soak/comments/168362.html</wfw:comment><comments>http://www.cppblog.com/soak/archive/2012/03/20/168362.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/soak/comments/commentRss/168362.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/soak/services/trackbacks/168362.html</trackback:ping><description><![CDATA[1、gcc（gnu collect compiler）是一组编译工具的总称。它主要完成的工作任务是&#8220;预处理&#8221;和&#8220;编译&#8221;，以及提供了与编译器紧密相关的运行库的支持，如libgcc_s.so、libstdc++.so等。 <br />
2、binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序，如汇编（as）、连接（ld）、静态库归档（ar）、反汇编 <br />
（objdump）、elf结构分析工具（readelf）、无效调试信息和符号的工具（strip）等。通常，binutils与gcc是紧密相集成 <br />
的，没有binutils的话，gcc是不能正常工作的。 <br />
3、glibc是gnu发布的libc库，也即c运行库。glibc是linux系统中最底层的api（应用程序开发接口），几乎其它任何的运行 <br />
库都会倚赖于glibc。glibc除了封装linux操作系统所提供的系统服务外，它本身也提供了许多其它一些必要功能服务的实现，主要的如下： <br />
（1）string，字符串处理 <br />
（2）signal，信号处理 <br />
（3）dlfcn，管理共享库的动态加载 <br />
（4）direct，文件目录操作 <br />
（5）elf，共享库的动态加载器，也即interpreter <br />
（6）iconv，不同字符集的编码转换 <br />
（7）inet，socket接口的实现 <br />
（8）intl，国际化，也即gettext的实现 <br />
（9）io <br />
（10）linuxthreads <br />
（11）locale，本地化 <br />
（12）login，虚拟终端设备的管理，及系统的安全访问 <br />
（13）malloc，动态内存的分配与管理 <br />
（14）nis <br />
（15）stdlib，其它基本功能 <br />
二、在现有系统上如何升级（redhat9上实践的） <br />
1、升级这些库时，最好不要覆盖系统中缺省的；因为这些库，尤其是glibc库，是系统中最核心的共享库和工具，如果盲目覆盖，很可能导致整个系 <br />
统瘫痪，因为一般更新glibc库时，其它所有以来libc库的共享库都需要重新被编译一遍。因此，为了调试某个程序进入glibc时，最好把glibc <br />
安装到/usr/local/lib下。 <br />
2、首先编译glibc库。注意最好令建立一个glibc-build的目录，configure时加上--enable-add-ons=linuxthreads选项。make install安装到/usr/local下。 <br />
3、修改gcc的spec文件（/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/specs），更改ld-linux.so.2为/usr/local/lib下的新的共享库装载器。 <br />
4、编译binutils库，此时被编译出的程序会连接到/usr/local/lib下的新的libc库。注意，在configure前，需要设置ld缺省连接的路径（LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib），否则binutils会 <br />
configure出错，找不到libc中的一些符号。具体步骤如下： <br />
（1）export LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib <br />
（2）mkdir binutils-build &amp;&amp; cd binutils-build <br />
（3）../binutils-2.13.90.0.18/configure <br />
（4）make（5）make -C ld clean <br />
（6）make -C ld LIB_PATH=/usr/lib:/lib:/usr/local/bin（设置编译后的ld的缺省库搜索路径，后面的比前面的优先级高） <br />
（7）make install <br />
三、总结 <br />
1、运行时，动态库的装载依赖于ld-linux.so.6的实现，它查找共享库的顺序如下： <br />
（1）ld-linux.so.6在可执行的目标文件中被指定，可用readelf命令查看 <br />
（2）ld-linux.so.6缺省在/usr/lib和lib中搜索；当glibc安装到/usr/local下时，它查找/usr/local/lib <br />
（3）LD_LIBRARY_PATH环境变量中所设定的路径 <br />
（4）/etc/ld.so.conf（或/usr/local/etc/ld.so.conf）中所指定的路径，由ldconfig生成二进制的ld.so.cache中 <br />
2、编译时，搜索库的路径顺序如下： <br />
（1）ld-linux.so.6由gcc的spec文件中所设定 <br />
（2）gcc --print-search-dirs所打印出的路径，主要是libgcc_s.so等库。可以通过GCC_EXEC_PREFIX来设定 <br />
（3）LIBRARY_PATH环境变量中所设定的路径，或编译的命令行中指定的-L/usr/local/lib <br />
（2）binutils中的ld所设定的缺省搜索路径顺序，编译binutils时指定。（可以通过&#8220;ld --verbose | grep SEARCH&#8221;来查看） <br />
3、二进制程序的搜索路径顺序为PATH环境变量中所设定。一般/usr/local/bin高于/usr/bin <br />
4、编译时的头文件的搜索路径顺序，与library的查找顺序类似。一般/usr/local/include高于/usr/include<br />
<img src ="http://www.cppblog.com/soak/aggbug/168362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/soak/" target="_blank">cpp</a> 2012-03-20 09:15 <a href="http://www.cppblog.com/soak/archive/2012/03/20/168362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>