一月三日 当前只有等待等待
世间的事情就是一层窗户纸一捅就破。关于gsoap的多个wsdl分别编译多个模块使用namespace的c++的链接错误是这样解决的,gsoap的document说的很清楚, 我只是不理解而已。最关键的是要用-CS开关编译一个可以是空的头文件来产生共用的serialization。编译stdsoap2.cpp的时候要使 用-DNO_NAMESPACES的开关,很明显的需要单独编译这个.o供以后的链接。就这么一个关键的地方,当然不明白也就没办法了。我对于多个wsdl并集的做法一直很抵触的原因是产生的代码文件非常大,很不好管理阅读。但是将多个wsdl分别编译是需要一点点的know-
how的,比如,使用一个空的env.h编译开关用-CS
-penv这样子的头文件envH.h必须是你的主代码的第一个include的头文件,否则很多的问题,如SOAP_OK没有定义之类。那么你在编译的
时候namespace需要解决,使用纯c的编译是偷懒的做法,虽然简单算不得好汉,soap2cpp2 -n -i -x -w
-QmyName
myName.h中使用-n是一个关键,否则总有一些问题,但是要注意你就不能再用-lgsoapssl++的动态库去链接了,因为会有
namespace未定义的链接错误,这个要怎么解决呢,查看代码stdsoap2_cpp.cpp里看到"WITHNO_NAMESPACES"的宏需
要定义,所以,你要直接编译这个代码文件同时加上-DWITHNO_NAMESPACES的宏定义开关来编译主的文件。其次看看doc知道你需要在soap_init之后调用soap_set_namespaces把你的独特命名的namespace设定,因为如果没有使用-n的话所有的namespace全局变量都是命名为namespace的,这个在*.nsmap里可以看到。 一月四日 当前只有等待等待 一月六日 当前只有等待等待
为了在本机运行server我需要一个最简单的cgi的webserver,于是选择lighttpd,编译的时候我只能禁止pcre和bzip2,主要
是配置文件的设置花了我一点时间,结果我依靠include
debug.conf把debug开关都带开看到了参数才明白需要把cgi-bin放在htdoc的目录下才能调用cgi。
service=weather
1. touch env.h
2. wsdl2h -qWeather ./weather.wsdl -o weather.h
3. soapcpp2 -CS -penv env.h
4. soapcpp2 -n -i -w -x -C -QWeather -pWeather -I/gsoap/import ./weather.h
5. g++ -g -DWITH_NONAMESPACES /gsoap/stdsoap2_cpp.cpp WeatherBasicHttpBinding_USCOREIWeatherForecastServiceProxy.cpp WeatherC.cpp WeatherMain.cpp envC.cpp -o weather.exe
一月七日 当前只有等待等待
编译结果发现确实依赖的是1.0版,这个问题其实我老早就专门解释实验验证过了,就是说在链接过程中实际上是.so文件的所谓的soname被当作了运行
期的动态库的名字,所以,在链接过程中链接的动态库不会因为运行环境存在多个版本的动态库而混乱。但是这个信念昨天被挑战的原因是我在自己实验的
gsoap客户端运行正常但是在集成进工程内的编译运行会爆出一些warning都是服务器证书自签名不可靠的,这个和你使用浏览器访问https网站服
务器证书不是正规签名的警告一样的,问题是为什么会有呢?跟踪发现是因为一个编译宏被打开导致SOAP_DEBUG这个开关打开才打印的debug信息。
其实在编译过程中也遇到不少问题,就是我希望使用根目录的Makefile.inc的一些定义,就在我的子目录里定义include
../Makefile.inc,然后再下面的子目录也这么作,结果就会出现所谓的open too many
files的错误,实际上是递归死循环的打开无限次文件,因为relative
path这里是错误的,不能有两级这种Include。看代码里面才意识到别人的做法确有独到之处,比如接口定义问题,实际上block和file两个存
储系统接口差别非常大,根本不好去作什么继承,那么我其实一直恍惚怎么作,才发现他们被定义在不同的namespace,所以接口名称一样其实根本不同,
仿佛根本就是两个不同的接口,但是依赖namespace的区分让他们都命名为相同的接口名字确实对于用户有好处。
一月九日 当前只有等待等待
1. 在wsdl2h里要加上-n的开关,这个namespace是web的不是c++ class那块的,我后来使用了一个模板类来把它作为模板参数。
2.suse11.3的编译有些罗嗦,首先要先安装openssl和zlib,都要设定为--prefix=/usr,其次编译过程中需要-ldl。
3.gsoap里的extras的头文件也需要。
一月十三日 当前只有等待等待
唯一值得记录的是如果你不设定init_soap使用keep-alive的话就意味着你每次的调用都要destroy/end,这个问题表现的当然是所谓的第二次的调用出现ssl的错误,不过这个迷雾仅仅让我头疼了几个小时而已。一月十六日 当前只有等待等待
改明代高启的《题宫女图》诗,《青楼女图》:闺蜜扶醉踏青苔,夜宴陪酒伴月还,小犬隔门吠清影,夜深院寂疑客来。一月二十日 当前只有等待等待
今天编译静态库发现 了我的一个错误认识,就是能否把多个静态库集成一个大的静态库呢?答案是至少linux不行,你只能用ar把obj编译成静态库。我之前对于编译静态库有 一种畏缩心理因为总是担心链接的问题,其实哪怕你的静态库里有模板类,只要你在适当的地方作Instantiate的话链接并不是问题。当然你直接编译成 动态库的话,链接的问题直接就暴露因为它有链接的过程,对于ar来说就是简单的“拼接”而已。一月二十四日 当前只有等待等待
当我的链接出现错误,解决的办法是把-lssl -lcrypto移到编译命令的末尾说明了什么呢?我安装的openssl的编译默认选项是静态库,这个特点使得链接的顺序成为了问题。二月二十日 当前只有等待等待
好长时间没有写日记了。二月二十二日 当前只有等待等待
我对于网络非常的不 熟悉,比如,我无法上网,但是路由器链接Internet正常,也显示我的电脑也连接上了,但是我无法ping到gateway,尽管我可以使用 dhclient更新我的dhcp的记录,同时我的无线网卡可以上网,同时通过有线连接我居然可以访问router的gui管理网站。这说明了神魔呢?说 明了我的电脑在防火前后面。这个正如你可以链接到Internet但是却无法访问网页也许是你的dns server设置失效一样。同样的,我的amule长久依赖都是显示low ip,随便google都告诉你要作port forwarding,这个是多么简单的配置我却一直不知所以然。说白了就是在router的配置上射了一个Policy需要在指定 ip/application上作端口映射,就是说external的port要映射到一般一样的端口。二月二十三日 当前只有等待等待我的Ubuntu系统已经挺乱了,意思是package broken的太多了,这个是难以解决的问题,除非我当初下定决心绝对不更新,可是那个时候我还不懂。所以在安装编译libmicrohttpd的过程中 需要用到的curl/gnutls之类的我都只好是用最新的源代码编译,结果就导致了系统的Lib比较旧,那么我安装的都是小心翼翼在 /usr/local/lib那么当我运行libmicrohttpd的例子的时候,我才发现他的可执行都是一些脚本,example的代码仅仅编译为. o文件,在运行例子的脚本里要和libmicrohttpd的lib链接,稍稍想一下就不应该感到大惊小怪,所谓的开发都是做回调函数,这个在主流如 apache之类都是用插件机制,可是在非主流的强调效率资源的web server肯定要重新编译了,那么怎么才能找到我的非正规的安装的libgnutls库呢?使用LD_LIBRARY_PATH临时设置当然没有问题, 可是多麻烦啊。所以,google就知道机制是这样子的,/etc/ld.so.conf里定义了需要寻找的库的路径,但是这个文件是一个躯壳,仅仅定义 所有定义文件的路径在/etc/ld.so.conf.d/*.conf于是,我需要定义我自己的 /etc/ld.so.conf.d/libgnutls.conf文件列明我的库的路径。当然你修改的要立刻生效需要调用ldconfig来更新。原来 就这么简单,我以前只是模模糊糊的理解。
二月二十五日 当前只有等待等待
《纸牌屋》太过于小资了,太过于左翼与自由派了,我常常纳闷为什么副总统拜登没有像以前那样活跃,也许是看了这个电视剧的关系,想要避嫌?二月二十七日 当前只有等待等待
昨天在rhel6.3上发现居然没有cmake,结果使用yum总是报错,检查发现package的cache都没有建立,google总觉得是安全的问 题,不得要领,后来发现redhat的package居然是从fedora来的,而我之前在redhat网站下载rpm居然有找不到需要到oracle的 网站才能下载到?!你觉得混乱吗?好端端的东西被oracle收购了就乱七八糟了,然后当然就很简单了,我的http_proxy没有设置 https_proxy,所以才无法在防火墙后面直接使用yum,就这么点事情折腾半天。二月二十八日 当前只有等待等待
在头文件里定义的array是一个非常的generic的,之所以不使用stl的vector据说原因是多平台编译的问题,但是在骗过编译器的同时给我编程造成很多的困扰,我在很多时候还是用stl的vector于是来回的拷贝很繁琐。三月三日 当前只有等待等待
这个兄弟有一个demo是关于restful api的,有时候我也是糊涂,对于一个git,我只想下载某一个部分,这个怎么可能?clone总是要从根部开始的呀。 这个需要用到两个lib,一个是boost 1.41或者更新,我的Ubuntu10.04恰恰好是1.40,刚好没有需要的property_tree,于是我就下载了1.53,其实什么版本都无 所谓的,只不过boost使用b2命令编译,其中用到bz2这个lib,我的ubuntu官方没有,我去下载bzip2.org 可是不知道为什么1.06版居然没有动态库?只好使用1.05版。我选择boost安装路径在/usr/local三月六日 当前只有等待等待
我把openssl编译成静态库加到我们的library里这样省的用户安装,其中需要所有的头文件,这命令很有用,把crypto目录下所有头文件都连同目录结构都拷贝,相当于distcopy:
//============================================================================
// Name : myThrowTest.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <boost/smart_ptr/shared_ptr.hpp>
#include <boost/config/no_tr1/memory.hpp> // std::auto_ptr
#include <boost/assert.hpp>
#include <boost/checked_delete.hpp>
#include <boost/throw_exception.hpp>
#include <boost/smart_ptr/detail/shared_count.hpp>
#include <boost/detail/workaround.hpp>
#include <boost/smart_ptr/detail/sp_convertible.hpp>
#include <boost/exception/diagnostic_information.hpp>
#include <boost/exception/exception.hpp>
#include <boost/exception_ptr.hpp>
#include <boost/exception/enable_current_exception.hpp>
using namespace std;
class A
{
public:
typedef boost::shared_ptr<A> ptr;
A(std::string name = "default") :
m_name(name)
{
}
void throwInDestor()
{
if (m_name == "throwInDestructor")
throw 34;
}
~A()
{
throwInDestor();
}
;
void throwName()
{
throw m_name;
}
std::string m_name;
};
void callfunc(A::ptr a)
{
a->throwName();
}
void callf1(A::ptr a)
{
A::ptr b(new A("throwInDestructor"));
callfunc(a);
}
void callf2()
{
A::ptr a(new A("call2"));
callf1(a);
}
int main()
{
try
{
try
{
callf2();
} catch (...)
{
std::cout << "inner: " << boost::diagnostic_information(
boost::current_exception())
<< std::endl;
}
} catch (...)
{
std::cout << "outer: " << boost::diagnostic_information(
boost::current_exception()) << std::endl;
}
}
三月十一日 当前只有等待等待
svn使用其实要比git来的复杂,亦或许我对于git的高级功能还不知道?在一个repositary里引用另一个这种做法也是常见的,结果是让你不能 轻易删除。可是我的情况不同,我打算删除的是我自己以前加进去的,删除后commit总是报错说lock token not available,在本地cleanup无效,后来只好转到windows使用tortoise,图形界面的菜单有一个check for modification里出现我删除的内容,有一个check repositary的按钮发现那些lock是在服务器远程,然后图形界面是由一个release lock的功能,这个怎样在命令行来做我还真的一无所知。三月十八日 当前只有等待等待
当那些精英们在谈论风花雪月的时候,当那些人妻人母们在唠奶奶经的时候,我在为那个core dump伤脑筋。这就是世界的差别。gsoap的gpl v2的license有可能要了我的命,因为我不知道是否还存在一个c/c++的生成soap的客户端的工具。三月二十二日 当前只有等待等待
hitachi的存储系统接受的参数需要一个结构来作传入传出,那么这个结构需要清零,我就写了一个宏:
#define STRUCT_CLEAR_MEMBER_AFTER(ptr, member) \
if ((ptr))
{
\
size_t size = sizeof(*(ptr)) -
((char*)(&((ptr)->member))-(char*)((ptr))); \
memset((char*)(&((ptr)->member)), 0, size); \
}
有错吗?我看不出。三月二十七日 当前只有等待等待
以上那个STRUCT_CLEAR_MEMBER_AFTER的宏居然在windows下会corrupt内存,原因何在呢?令人难以思议,唯一的猜测是 hitachi的工程师的帮助,那个跨平台的大一统的参数结构(512bytes)的一个结构居然不给你使用#pragma pack(1),也就是说每个平台的每个编译器都按照本地的alignment来定义那个结构的大小,比如正常的编译器设置可能都是alignment= 4的一个byte的成员占4个byte如果这个没有4byte对齐的话。然后好心的hitachi工程师在rmlib里面据说完成endian的变换,数 据的对齐,这个帮助了每个平台的开发者,可是我却没有意识到这个问题。于是想露脸结果把屁股露出来了。三月二十八日 当前只有等待等待
需要使用一个xml的parser,我讨厌复杂的xerces,因为我的需求有限,就是soap server产生的标准的xml,很规范无复杂的feature,何必需要在引入复杂的编译和license的问题呢?所以我选择了简单的不能再简单的 tinyxml2,他的前身tinyxml我也用过,据说效率是不凡的,因为用回调函数输出能够防止读取巨大xml文件的大内存耗用。不过怎样遍历xml 的节点呢?还是学习了一下,这个是一个DFS,即深度优先的搜索,简单的不能再简单了,我对于soap的xml的结构终于有了第一步的认识,首先 declaration是xml的边准的,然后就是所谓的envelope,里面大体定义了一些namespace,然后在body里面才是根据一个个的 namespace的定义的内容,envelope是body的父亲,而不是兄弟,这个是我没有想到的。
#include "tinyxml2.h"
#include <iostream>
using namespace std;
using namespace tinyxml2;
void doRecurse(XMLNode* node)
{
while (node != NULL)
{
cout << " value:"<< node->Value() << endl;
XMLNode* sonNode = node->FirstChild();
doRecurse(sonNode);
node = node->NextSibling();
}
}
void test1()
{
XMLDocument xmlDoc;
XMLError xmlRes = xmlDoc.LoadFile("request.xml");
if (xmlRes != XML_SUCCESS)
{
cout << " failed " << endl;
return;
}
XMLNode* rootNode = xmlDoc.FirstChild();
doRecurse(rootNode);
}
四月十一日 当前只有等待等待
回了趟厦门,常常感到无语,因为共产党虽然让我觉得是一个腐朽没落的政党,但是似乎又是一个无可奈何的选择,相信非常多的我的同龄人是这样认为的,至少共产党有意识的让人们这么建立了这么一个观念。四月十四日 当前只有等待等待
我有些疑惑,以前我设定eclipse里的static library 的linking是使用:/full/path/full/static/lib/name,可是好像不行,现在反而要改为lib path和-lname.四月十七日 当前只有等待等待
运行topcoder的.jnlp程序需要下载java7,安装实际就是把他拷贝到一个固定地方,然后把你需要的java或者javaws 的软连接指向而已。然后运行javaws提示运行那个.jnlp。玩了一会openssl就放弃了,这个我目前玩不动,连证书和密钥都没搞明白怎么运行?四月十九日 当前只有等待等待
打发时间。这个250分的题目我却希望能够找到怎样 实现社会公平正义的计算机的解决办法,问题如下,一个社会的每个成员收入有高有低,一个理想的社会主义者,或者说奥巴马想要让社会人人平等把所有的人的工 资通过征税和补贴的方式让每个人和这个社会的最高收入者的收入差不大于一个很小的数字,比如一万美元,那么问题是怎样计算一个这样的标准收入水平以便让美 国的国税局和社会保障部在对高收入者征税和对低收入者补贴的程序最简单,也就是说高收入征税的总和和低收入补贴的总和加起来最少,那么为了达到“公平社 会”所需要付出的公共资源就最少,浪费最小,影响的社会层面也最小。这就是一个寻找社会收入中位数还是平均数的过程?我想了半天也不确定那种最靠谱,看来 “和平”解决这个问题是没有可能了,对于程序员来说最欣赏的就是“暴力”,我现在非常的恐怖,几乎对于所有的问题都采用“暴力”的解决方案,难道我已经成 为这个社会的不稳定因素了?但是不管怎样从心底里还是要呐喊那句经典:Brute force, I love you! 怎么你不知道我说的“暴力”就是brute force吗?说明你是非计算机专业毕业的。四月二十九日 当前只有等待等待
我现在还算谨慎,下载zfs编译需要大概是内核的支持所谓的spl的package,我不敢安装,就在configure --with-spl=/my/download/spl/path,这时候zfs的configure抱怨需要libuuid,我没找到开发包就下载 libuuid运行包的源码,apt解决认为下载util-linux的源码捎带附赠blkid的源码,我configure也不敢安装,看起来 uuid.h的头文件没什么花哨仅仅是函数定义,应该无害,编译手动拷贝头文件,动态库不敢拷贝就用系统自己的,甚至都不敢添加不去别soname的 general的软连接,保持系统带版本号的软连接,防止可能的问题,拷贝uuid.pc到/usr/lib/pkgconfig,把lib的路径的 prefix改为空白因为系统的不是在/usr/lib而是/lib,因为这个东西是属于非常核心的util-linux的,印象中你自己制作linux 操作系统的时候这个包是和glibc之类一样的非常非常基本的东西,非常害怕触碰。不过后来还是屈服了不得不加一个libuuid.so.1 libuuid.so的软连接。五月一日 当前只有等待等待
写makefile曾经被狠狠地折磨过一次,原因其实很简单,就是写一个循环:五月二日 当前只有等待等待
使用gsoap的人应该都会遇到一个问题是openssl/gnutls的问题,我没有使用config.h而是直接在configure里面定义,后来 在rhel6.3下产生的代码要被用到suse11.3和solaris,现在要用到windows2008了,结果编译方法当然差别很大,我曾经想要使 用nmake来作,但是这个要求原来linux的makefile要和nmake兼容,很不容易,最后才意识到windows的容易不是白说的,你作为开 发者压根不需要操心编译的很多的细节,直接把所有的代码文件通通拉到工程下面就成了。当然我又一次犯了以前的一个错误,话说gsoap使用所谓的 namespace来区别各个定义和函数,这当然是webservice原本定义的,其中对于每一个wsdl文件你可以定义自己的一个struct Name;的实例,也可以使用各个独立的namespace当然需要你事先定义好不重复,总之细节是在struct soap里面有一个所谓的变量struct Name的成员变量,当你定义了使用namespace的时候那个全局变量extern struct Name namespaces[];就不得不定义了,因为有soap.names=namespaces;我当时为此百思不得其解,后来看到它有#ifdef WITH_NAMESPACE才是这样子,而else里是soap.names=NULL;这里就不在需要定义那个全局的extern struct Name namespaces[];说来话长,其实实在不足道,压根儿就是写给自己看的。五月三日 当前只有等待等待
脑海里经常的一片空白。五月五日 当前只有等待等待
一个古老的故事就是老生常谈了,在cisco的时候就遇到,比如你写了一个测试程序需要进行一些系统测试,例如打开系统设备,加载内核模块等等,但是出于 安全考虑不愿意给每个人使用root登录(特别是以前我们希望小组里每个人都用自己的用户登录进行独立测试,有自己的log等等),那么你怎么进行呢?以 前Balaji就反复说使用setuid,我其实只闻其名不明其所以然,也是懒惰这么一个东西几年都没有google读书,今早上看了一下是这样子的,把 我的那个测试程序改成root为owner,同时设置它的setuid bit设置,也就是说当我运行这个程序的时候我的进程的effective user就是这个文件的owner了。而程序执行操作的时候通常是使用effective user来测试权限的。所以,我以为我可以在eclipse里使用debug来这样运行,可是失败了,为什么?这个是gdb的限制吧?五月十一日 当前只有等待等待
关于rsync的一个rollover checksum的算法是这样子的,我把他们重新定义了一下:
Given a series of byte stream data, define calculation of rollover checksum as repeating calling the following two functions:
1. function: byte_rollover_checksum_fun or BR; input: previous BR result and current bytes
2. function: rollover_checksum or RC; input: previous RC result and result of current BR
let br[n] be result of BR of n operations;
let rc[n] be result of RC of n operations;
let data[n] be input byte stream data;
let br[0] = rc[0] = 0;
rc[i+1] = RC(rc[i], data[i+1]);
br[i+1] = BR(br[i], rc[i+1]) ==> br[i+1] = BR(br[i], RC(rc[i], data[i+1]));
So what???
OK, here is our trick. Let us design our function BR, CR to be "linear
functions". (我自己定义的一般性二元线性方程: if f, g are functions and f(g(a,b)) ==
g(f(a,b)) then f, g are linear function)
We also give a feature of RC and BR such that RC(r, 0) = r and BR(b, 0) = b. (somthing like an identity property??)
Therefore br[i+1]= BR(RC(br[i],0), RC(rc[i], data[i+1]) = RC(BR(br[i], 0), BR(rc[i], data[i+1]) = ???
其实我当时就是想去推演一下rollover checksum的公式而已。以后有时间在搞吧。五月十三日 当前只有等待等待
年纪成为兴趣变化的主因,开始对于文件系统学习,看看btrfs吧,但是需要用到libblkid,以及ext2fsprogs而奇怪的是从它的官方git得到的最新源码居然缺失了很多libblkid的很多新函数,看看这个发布者的博客学习一下吧。编译btrfs的时候需要的library如下:sudo apt-get build-dep btrfs-tools
-or-
sudo apt-get install uuid-dev libattr1-dev zlib1g-dev libacl1-dev e2fslibs-dev libblkid-dev liblzo2-dev
不过我的古董级的ubuntu10.04早已脱离主流了,我无法加载官方的库,只好下载源码编译e2fslibs-dev。
windows的确是开发者的梦魇,我因为需要使用gsoap的客户端必须要在windows下链接openssl的1.01xx版本,但是原本的库里面已经有用到
0.98的openssl,这个现在无法替代因为是从日本过来的binary,那么在windows下是没有Linux的soname或者软链接之类的,
所以,唯一的办法就是编译openssl把它重新命名.lib来链接。五月十五日 当前只有等待等待
我的ubuntu10.04没有把btrfs内核编译进去,于是需要编译内核模块,最简单的是这样子的:五月二十五日 当前只有等待等待
花了一点时间机械的把ssh2的例子重新组织了一下,结果发现始终在userpasswd_authorization过程很慢,而运行例子非常的快,还以为是什么特殊的原因,后来才发现例子用的是127.0.0.1而我的测试使用的虽然也是本机地址,但是和那个内存里的Loopback比较还是慢的多了。六月一日 当前只有等待等待
You don't have my respect unless you win it, or at least earn it! In the first case, I yearn to your superiority. In the second case, I yearn to your monetary power.六月十四日 当前只有等待等待
加班有时候成为常态了,不过我并没有什么可抱怨的,如果不加班干活也没有什么好干的了。六月十七日 当前只有等待等待
一个简单的不能再简单的问题,就是makefile里缅经常能够遇到错误而不停下来的问题,比如 cd abc; make 这就是问题,因为这个要编程cd abc && make就会返回错误,make就会停下来了。六月二十日 当前只有等待等待
凡事都使用武力来解决是不行的,但是凡事都绝对都不使用武力也是绝对不行的。中共归根结底的本质还是一个腐朽没落的封建帝国,遵循内残外忍是一个基本的治 国原则,而这一切的根本原因一方面是红色恐怖的残暴,另一方面是商民族的一贯的柔弱与逆来顺受。昨天看到一个金融时报的博客引述的传教士利玛窦的话:一个疆域巨大有着数不尽的人力物力和不计其数的军队的泱泱大国的统治者却整天整晚的生活在惶惶不可终日之间,时时刻刻担心着周围小国的侵略与袭扰,担心着手无寸铁的臣民的反抗。六月二十一日 当前只有等待等待
埃尔夫仙女对福尔都说:当所有的星星都熄灭的时候,唯一照亮这个世界的光明就是你的心灵。六月二十二日 当前只有等待等待
我原来对于ftp协议一无所知,所以,在读了一点点wiki才明白我原来想的根本不对,其实,它就是一个在古老年代创建起来的架构,一个一问一答的模式, 所以使用libcurl难怪不好用,因此开发就流于一个命令行解释器了,我很感无聊就不再想折腾了。于是回到以前的那个S3吧。但是发现amazon升级 的很多,现在的S3已经是第四版了,加密方法改了太多太多,看样子要推倒重写了。六月二十三日 当前只有等待等待
我改写的签名有什么地方有错,下载新版的libs3对照,发现也许是一个小问题,基本的数字签名算法并没有改变。重新整理一下。先报存一个版本的libs3作 为参考。有几个基本的无脑级别的comment:所谓的aws的sdk只有windows/java/script之类的,linux是没有sdk的,能 开越野车的人还需要培训驾照吗?这个libs3其实和以前架构没变,依然没有multipart upload因为这个太复杂了,和普通的函数差别非常大,我还是很自豪以前我能够写这么一个,准备调试一下把它整理出来。六月二十五日 当前只有等待等待
我为了安装打印机驱动结果把整个系统感掉了,这个是我长久以来就期待的吗?折腾吧。六月二十七日 当前只有等待等待
编译gcc需要什么texinfo之类的,忘了,反正要编译multi-lib需要安装额外的32位的包。然后,开始debug出现了这个错误:Dwarf Error: wrong version in compilation unit header (is 4, should be 2),google 之后才意识到是gdb没有与时俱进看来编译器用了最新的gdb也要更新为7.x版的了。编译源码吧,以前在cisco打杂不明白他们为什么自己编译 gdb,看来工欲善其事,必先利其器。学习一下。很有可能是同样的原因,因为新版的编译器解决了很多的问题,那么他们当然希望使用,那么没有选择的要使用 新版的gdb,这个小问题在三年后我才意识到,之前我都仅仅使用4.7版以前的gcc都没有这个问题。六月二十九日 当前只有等待等待
一个恼人的地方是ubuntu10.04不再有官方的全力支持,新的package大豆不兼容,就是说自动升级导致大批旧的package完全无法安装, 于是我就只好手动一个一个把他们降级以便安装其他依赖的包,甚至像是ext2fsprogs这样的关键包也不例外,我的策略是现在干脆把可能安装的包通通 都安装以至于将来不会再不小心安装错误的新版的包。好累啊。七月六日 当前只有等待等待
这个东西纯粹是朝花夕拾的性质,几乎是毫无悬念的玩意,我有libs3的源代码,有aws的官方文档,大量的人已经大量的好几年的实践开发,S3又是所有 aws里最成熟的玩意,想不出有什么问题,可是我还是犯了不少的错误,md5不是直接的hex形式要用base64转码,当然这个是document里写 的明明白白的,只是我很奇怪我以前的代码没有这么做,那么究竟是怎么成功上传的呢?总不会是最近才改动的吧?七月七日 当前只有等待等待
学习ext2fs这个听上去像是王朔小说里的那个杀人犯自供书里的不在现场证据的供词,我清楚记得他当时说是在加学习毛主席著作《敦促杜聿明投降书》之类的。七月十日 当前只有等待等待
这个又是一个笑话,我把content-type和content-encoding搞混了,后者实际是压缩方式,服务器端使用这个,客户端使用accepted-encoding,结果所有的都被当作二进制流设定了。只好全部上传,找不到改动metadata的api。七月十三日 当前只有等待等待
这个是值得记录的:在HNAS里的所谓ssh有些花哨。实际上我对于screen不熟悉所以不是很清楚究竟发生了什么事情,但是普通的libssh2链接 后得不到运行结果,因为系统不是简单运行bash,而是在一个自定义的Login之后运行一个自定义的命令解释器,所以,在ssh命令里需要 /self/defined/interpreter actual-command。因为正常你默认使用sh来运行命令。七月十六日 当前只有等待等待
这个是synology的命令表,有点用。也许是实际的bash,但也许是一个自己的解释器,或者更加可能的是裁剪过的bash之类的shell,不过有ssh很方便的。七月二十日 当前只有等待等待
这个是一个好东西,读了一点是一点,就好像当初张无忌学习乾坤大挪移一般,在有限的时间能有多少就是多少,学一点也是受用无穷的。实际上我看了没一页就犯困了,为了惩罚自己,我决定在烈日下跑步。七月二十一日 当前只有等待等待
其实这是一个非常简单的问题,但是我就是一开始不开窍:使用nfs的时候,怎样让Mount的文件及目录是我自己的用户名?多简单的问题啊,之前我使用两 台ubuntu彼此用nfs mount从来没有意识到这是个问题,现在使用synology才发现这个问题,就是这么简单,在synology的nas上的Nfs server上的Nick这个用户和我自己ubuntu上的名字一样却是完全风马牛不相及的,只能用pid/uid来mapping啊,所以,就都改成了 1000.1000,至于server的设置,
cat /etc/exports
/volume1/DiskStation
*(rw,async,no_wdelay,insecure,root_squash,insecure_locks,sec=sys,anonuid=1000,anongid=1000)
明白了吗?七月二十三日 当前只有等待等待
其实我加班都是自找的,明明可以早点回家却在办公室里搞一些额外的东西,首先,在64位Linux机器上编译32位的程序就是一个问题,究竟有何益处?应 该唯一的好处就是在一台主机上能够做32/64位的开发编译工作,但是rhel是否有官方的全套的库需要我发现。其次,我遇到一个问题花了一天才明白一点 端倪,就是我的32位的rhel6.3在debug时候,gdb居然占用100%cpu,(当然后来意识到是多核的100%实际上是一个核的100%,不 过没啥区别)我一开始总是以为是程序本身复杂,比如变量多symbol table大?但是后来不再eclipse里直接使用gdb并没有发现这个问题,说明这是eclipse的问题,一开始还以为是memory thrashing,所以在启动eclipse的参数上做文章,实际上我以前就已经设定了jvm的1024M内存的参数,所以并没有什么大的变化。后来发 现并非总是伴随大内存使用,主要是cpu的99-100%的现象,然后就是使用不同版本的eclipse,并升级,依然没有结果,然后观察到在 eclipse的console里显示一个python的函数转换long int时候报错说是integer overflow,现在我在写这些东西的时候有了一个新的想法:在rhel里面gdb/gcc/gdbinit之类的都是一些空壳子,是python的小 脚本包装了一层,说不定出错的是这些壳子,明天去办公室尝试看看,因为经过一天多的排查我已经否定了是操作系统32位内存问题,否定了gdb本身的问题, 否定了是eclipse的版本问题,现在看来说不定是这个gdb python壳子的问题!在这之前我还花了大半天时间解决另一个可能性,就是把我的gsoap大量的产生代码文件另外编译成一个静态库并把binary checkin到svn,一方面加快编译速度,另一方面看看能否解决debug100%cpu占用问题。这个工作基本就是修改makefile的工作,不 过调试起来还是花了一点点时间,因为合成两个静态库在linux下是不像windows那么直接,你要把静态库extract成原先的.o来ar生成新的 静态库,这里面有一定的风险就是同名文件的覆盖,之前我曾经为了避免这个使用了一个ar的开关是-T但是这个是新版编译器才支持的开关,老版的ar,忘了 是什么版本,其实也是挺新的不支持。所以,有些罗嗦。每天干了多少事情真是说不完,因为很多时候就是一层窗户纸,一捅就破,但是之前就是看不清楚。七月二十四日 当前只有等待等待
有件事情我始终忘记提了,很重要。曾经一段时间我的工作的rhel6.3出现莫名其妙的coredump,同样的程序甚至curl下载文件都会,而在别的 机器正常,猜想原因可能是我自己编译安装的libcurl/libopenssl等等有问题,但是也可能还有不少的软件被我安装过,曾经一度想让管理员重 构一下系统,后来想一想这个是无厘头的普通人的想法,首先不可能是内核的问题,我没有程序我自己也没有触碰,那么仅仅是目前安装的库的问题,这个当然可以 重新安装,于是找来rhel6.3的光盘iso,linux映射光盘mount -o iso9660,然后安装rpm,for i in rpm/*.rpm; do rpm -i $i; done想想看这个是不是就是重新安装了,当然也许有多一些rpm我并不在乎。另一个问题是我曾经需要系统的一些rpm里的静态库,默认安装只给你动态 库,所以只能自己编译,rhel给你的是source rpm,这个需要这样子mkdir build && cd build && rpm2cpio ../curl.src.rpm | cpio -idv然后发现有相当多的patch,一个一个打包累死你,所以,for i in *.patch; do cat $i | patch -p1; done 然后就是configure/make了,不过对于多个编译curl我还是很烦因为他需要libidn,libssh2等等,我每个都下载编译源码,但是 不安装设置configure似乎都不成功。总之很麻烦。七月二十五日 当前只有等待等待
怎样在eclipse里面debug一些需要root权限的程序呢?这里说的很清楚我却做不对:我鬼使神差的总是觉得要设置eclipse或者是被debug的程序本身作为可以sudo不需要password的,这个是不是很好笑呢?你不运行sudo那么设置这个sudo visudo里nick ALL=(root) NOPASSWD:/usr/bin/gdb也没有用,当然你要eclipse里把gdb改为sudo -u nick gdb。
学习ext2编程接口。
八月三日 当前只有等待等待
一直被困扰的是之前以上认为sudo可以工作来debug,但是不知道为什么突然又不行了。编译e2fsprog发生了一些错误,想起来我的笔记本安装的 是gcc4.8版本,改用4.6版。然后链接ext2fs发生com_err的链接错误发现原来e2fs_prog把libcom_err.a编成了一个 单独的库,当然会出现这个问题了。今天终于受到了tpm芯片,插在了主板的20针插槽上,按照这个步骤在sudo tpm_takeownership
发生错误,需要慢慢的debug了。八月九日 当前只有等待等待
昨天这个bug是非常有教育意义的,这个是一个经典的问题,对于这个...符号不一定所有的程序员都非常的熟悉,至于说他的handle的宏 va_list的特性就更加不一定了。问题是结合了另一个不是很常用的函数vsnprintf,这个是snprintf的堂兄,不同的是因为它的参数是那 个va_list这个理论的长度是无限的没有人可以保证你分配的内存足够长,与是vsnprintf保证你返回需要的长度让你来分配,但是是否真的返回值 就是需要的长度呢?这里有经典的解释:假定你传入的buffer长度值为n,返回值可能如下:八月十四日 当前只有等待等待
stackoverflow上的大牛帖,赶快记录下来实践一下,我忍不住破坏自己的原则:直接摘抄了,害怕以后找不到。Each process has three capability sets:
- Effective (the caps that this process actually has)
- Permitted (the caps that this process can possibly have - a superset of Effective)
- Inheritable (the caps that this process can pass to a child process)
Each file has the same capability sets. When a new binary is exec()'d, the capabilities of the process change according to the following rules, where:
- pI/pP are the process's initial Inheritable/Permitted capabilities
- pI'/pP'/pE' are the process's new Inheritable/Permitted/Effective capabilities
- fI/fP/fE are the file's Inheritable/Permitted/Effective capabilites
- & represents intersection
| represents union
pI' = pI
pP' = fP | (pI & fI)
pE' = fE & pP'(simplified from http://www.friedhoff.org/posixfilecaps.html)
In most scenarios, pE' is the only result we care about. Programs that are linked against libcap can call setcap() to change their Effective caps (as long as the caps they try to request are in the Permitted set), but the vast majority of programs don't explicitly touch their caps so we have to arrange for the cap to be effective post-exec().
Having a concrete example will help understanding here... I got fed up with having to 'su' to run openvpn, so I wanted to grant myself the CAP_NET_ADMIN capability to allow the setting of routes and such.
Looking at the last rule (
pE' = fE & pP'
) it's clear that to have CAP_NET_ADMIN in the process's Effective set, CAP_NET_ADMIN must be in the file's Effective set. So, the capabilities system doesn't allow us to simply say "grant CAP_NET_ADMIN to user sqweek" - the program's capabilities are always important.Being in the file's Effective set isn't enough though, the cap also needs to be in the process's new Permitted set. Lets look at that rule:
pP' = fP | (pI & fI)
. So there's two ways we can get the cap inpP'
, either we add CAP_NET_ADMIN to the file's Permitted set, or we add it to the file's Inheritable set and make sure it is in the process's Inheritable set.
八月十五日 当前只有等待等待
这里才是源头, 其中的bounding capset如果不看这里就不明白所以。修改/etc/security/capability.conf可以给你的进程增加Inheritable的 capability,但是格式让我困惑了一会儿,你必须把所有的cap用逗号隔开写成一行,否则不认,而且只要有一个错误就前功尽弃,并且系统只读一 次。然后我就ctrl+shift+F6去另一个console去login/logout来看是否登录后权限如此,因为这个游戏是很危险的,很可能把你 自己锁住。对于文件的权限,可以使用setcap/getcap来操作,其中的格式可以参考cap_from_text的manpage的例子来看。至于 说cap的名字只能从代码里面来了。这个给出的具体的例子怎样不使用setuid给ping而只让某些用户能够使用ping非常的好。事实上很多人都不知道居然一个简单的Ping居然有特殊的权限才能运行,这里的很多人指的就是我。
pI_new = pI
pP_new = (X & fP) | (fI & pI)
pE_new = pP_new
pE_new = empty
if fE == true
if fE == false
第一眼看过去两个公式不一样,tnnd我的脑子有进水居然相差了,意思就是说fE有最后的生杀予夺的决定权。来验证一下?nfs的export: showmount 172.17.37.46 八月十七日 当前只有等待等待
2.mount到本地磁盘:
cifs的share: net use x: \\172.17.37.46\cifs-share
nfs的export: mount 172.17.37.46:/nfs-exprt y:\
注意这里的一个小小的trick是如果权限被禁止,nfs只能使用anonymous用户的话,你一定要使用该用户来mount否则无法访问: mount -o anon 172.17.37.46:/nfs-export m:\
在windows上nfs并不是自动就有的,需要add role去添加那个服务包,然后启动nfs的服务才行,所以,这个是很罗嗦的。
后来我想给java加上权限,它拒绝了,权限给他了,然后他很正义的拒绝启动,真是好同志,不贪不腐,共产党员能做到像这种遇到权力就让该多好。
每天都学习一些新东西,Linux博大精深没有十几年经验算不上精通,我现在连入门都觉得夸张,比如chattr -V +i
对于文件可以添加一个只有lsattr才能看到的attribute,这个immutable可以很让人摸不着头脑因为你不是root你删不掉,其他的+
a也会有用的如果作为log文件的话,这个就是cap_linux_immutable的权限。
找了半天才找到,如果你想知道你的权限,很简单的:capsh --print就看到了bounding set cap:
Current: = cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setfcap+i
Bounding set
=cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,
cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,
cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,34,35
我觉得我的Ubuntu版本内核没有屏蔽任何的cap。只不过/proc/../bound-cap没有了,我也忘了具体路径了因为找不到。我差不多被彻底打败了,完全无头绪,权限实在是一个谜题。我把setcap设定了cap_setfcap的+iep,然后我运行setcap再也不需要sudo了,当然我自己本身也有cap_setfcap的Inheritable。 八月十八日 当前只有等待等待 八月二十三日 当前只有等待等待
全部攻略如下:
1.编辑/etc/security/capability.conf增加cap_dac_override
nick
你不需要其他的权限,需要logout,最好你先用其他tty登录测试一下。
2.把你现在要debug的程序的权限提高setcap cap_dac_override+ie /home/nick/MyProjects/ext2fs-client/Debug/ext2fs-client
3.把你的shell的权限提高:setcap cap_dac_override+ie /bin/bash
4.把你的gdb的权限提高:setcap cap_dac_override+ie `which gdb` (你还是要提高gdb因为它不是父亲,可是它是祖父。)
至于eclipse完全不需理会他只是看客不需要权限。
这里是本人在stackoverflow.com上发的第一个帖子!感到无比自豪。
需要重启才知道的:
auth required pam_cap.so debug
auth include system-auth
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
account include system-auth
password include system-auth
session include system-auth
session optional pam_xauth.so
需要重启才知道的:logout依然不能最后确认,需要真的重启才知道。在/etc/security/capability.conf里
cap_dac_override,cap_setfcap,cap_kill nick
也就是说我自己拥有无视文件拥有者的特权,额外的cap_setfcap的原因是我想在eclipse的build
step里的post-build step设定如下: setcap cap_dac_override+ie
${ProjName}之所以我能够不需sudo又不舍定免除sudo password的原因是我把setcap本身的特权提升了, 八月二十八日 当前只有等待等待 八月三十日 当前只有等待等待 十月二十三日 当前只有等待等待 十月二十九日 当前只有等待等待
nick@nick-server64:~$ getcap `which setcap`
/sbin/setcap = cap_setfcap+ei
也就是说我自己的特权配合setcap的cap_setfcap的特权可以自由的给要debug的对象executable设定
cap_dac_override+ie的特权,这样子在我debug的时候就可以自由的打开/dev/sda1之类的原本只有root权限的文件了。
怎么样设定的有些曲折吧?
在e2fs-progs的函数里,ext2fs_get_next_inode如果得到的ext2_ino_t的值为0说明已经把当前的inode穷尽
了,该退出了,函数是始终都返回正常的0的,这是一个小细节。由此,你可以在使用ext2fs_check_directory配合
ext2fs_get_pathname来遍历文件系统的所有的目录,估计一些删除的文件/目录也可以由此有限的恢复一部分。来尝试一下?
debug中发现我的文件系统中的dirent的长度似乎是当初用signed
int16写入的,而头文件里这个类型是unsigned,难道代码有什么问题?开始怀疑eclipse的gui里面debug也许显示有问题,就直接用
gdb跟踪发现是一样的,那么为什么防范行的代码没有报错呢?比如e2fs-progs里面都会检查dirent的name_len是否超出了
rec_len,这里发现也许是有问题吧,取得name_len的函数做了一个entry->name_len &
0xff这里也许对吧,因为所有的文件名长度都是小于256的,因此这个值其实没有人care?也许是为了其他文件系统扩展用的buffer的长度?
有时候感觉自己就是武侠小说里的武林人士为将来扬名立万而隐居深山修习不知名的武功,手捧一本不知哪里得来的武功秘籍参习修炼,其间岁月如梭,时光似电,
斗转星移,沧海桑田,终于有一日破关出世发现世间已然改变了。当然这个过程里获得的乐趣早已把原先的一心一意要争强好胜扬名立万的念头抛到九霄云外了。这
就是学习。
打印机坏了,买了新的hp deskjet
2540,安装Ubuntu10.04驱动无法识别wifi下的打印机,折腾了很久很久才偶然发现打印机上的一个按钮,原来要按钮开启wifi-
direct的模式,晕倒。同时,打印机支持web
gui设置,有众多的工具可以使用,比如hp-setup添加打印机,hp-check检查软件环境等。
自己做了一个小实验,你的最最简单的helloworld程序甚至空的main也有一下的链接:这里需要提到的是我的编译指令没有提到过libstdc+
+.so,可是编译器都会作此链接,这才是要命的,因为,连接器如果先找到了stdc++库里的函数就直接解决了,而用户的-
L/library/search/path是优先寻找的。
nick@nick-server64:~/MyProjects/myLibTest/Debug$ ldd ./mytest.exe
linux-vdso.so.1 => (0x00007fff3d1e0000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f42db4f8000)
libm.so.6 => /lib/libm.so.6 (0x00007f42db270000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f42db058000)
libc.so.6 => /lib/libc.so.6 (0x00007f42dacd0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f42db838000)
十一月十三日 当前只有等待等待
ExceptionClass ex;
Throw ex;
改变为throw ExceptionClass();据说这个临时变量不在栈里面。
D试图静态链接libstdc++.a但是总是不成功,我查看了readelf -a libstdc++.a | grep
__cxa_throw发现很多都是UND,我的理论是.a实际是.o的concatenation并不去作链接,那么静态库里的所有的obj文件都不会
作resolve,因此链接不成。于是我的建议是要拿libstdc++.a的代码来编译,要么就是ar
-x把静态库的obj都extract出来作链接。V曾经说linker的-W,static的指令不起作用除非所有的都是静态库才行。
十一月十六日 当前只有等待等待
很久很久以前,一个bug像幽灵一样存在着,他的出现发生在一个异常exception的产生,在客栈(stack)里的过客消亡的瞬间,某些物件
object不愿心甘情愿的被销毁,在通往黄泉路上(destructor)里蓬发出了另一个异常,于是两个叠加的异常让编译器无所侍从,大概是在
unwind_resume之类的函数里直接抛出了信号signal继而就是核爆coredump,面对这一切在我们这些外人看来只看到最后的
coredump和第一个异常的抛出,很难扑捉到第二个异常的起因,很多时候迷信的说法甚嚣尘上:也许是内存地址的越界写(memory
corruption),也许是非法指针(dangling
pointer),解决的方法也是迷信的无厘头,有人改变编译器的优化模式,有人重新组织代码,还有人干脆把客栈里的访客通通作动态内存分配,在异常抛出
前消灭所有的动态物件保证栈里空空荡荡。但是究竟真正的原因在哪里呢?而且为什么同样的代码只发生在红帽子(rhel6.3
32位)里呢?有人开始怀疑是编译器的问题。。。
终于有一天一个勇士注意到在coredump的backtrace里的蛛丝马迹,系统的__cxa_throw出现在coredump的最后一刻,而这样
的函数本应该来自于libstdc++.so可是为什么它显示自己的出身是一个普通的动态库呢?答案很快有了,当初日本人在开发这个动态库的时候使用了静
态链接把libstd++的代码链接进来,于是我在链接的时候就被日本的动态库“拦截”了,这个和黑客的拦截技术如出一辙,只不过是非恶意的无意之作。
终于找到了问题的症结,如何解决呢?
To link or not to link? This is a question。
有人说使用动态库并坚持下去是唯一不变的选择。于是调整linker的链接顺序把-lstdc++放在前面,可是,以前就是这样为什么不成功呢?有一个观
察是即使你不写-lstdc++的话编译器也会在最后去主动链接它,所以,我的猜想编译器只有最后才去链接。另一个猜想是你虽然把-lstdc++放在了
前面,可是我们把-L/japan/library/path也放在了前面,因为默认的系统的路径是没有用户自己的-L的search
path来的优先的,因此,linker在搜索的时候会优先找到日本的动态库。
我觉得静态链接是唯一的解决办法,因为可靠。学编程号称很多年的你,究竟理解这些有几成。
在g++/gcc的参数里-W,后面是给linker的参数,你告诉linker我要静态static不就完了? end of story.
period.
真的吗?我告诉你不行,你先告诉我rhel的gcc的版本是什么,什么4.4.7那么不行,因为-W,static后面只能都是.a才行,如果你混合了.
so的话,编译器又无所适从,就退化回动态库了。那么你就-Bstatic lib1.a lib2.a -Bdynamic lib3.so
lib4.so不就行了?还有人说何必那么麻烦,你升级gcc到4.7就可以了。后一种做法很有趣,我们升级了编译器,(在操作系统里如何运行两个版本的
gcc呢?安装的时候有一个小工具可以改变symlink之类的还包括环境变量等等。)然后单单运行-W,static果然就做了静态链接,有趣的是编译
器也不过就是自己生成了-Bstatic ...
-Bdyanmic原理和自己手动一样的,那么升级编译器是否升级了glibc之类的类库呢?(问这个问题肯定是重要的,因为发行环境变了你要求你的用户
也要升级编译环境就是大问题了。)gcc
--print-search-dirs发现并没有指向不同的libc的版本,我相信升级编译器不可能需要升级glibc否则你要把linux的文件系统
(所有的binary,不是“file
system”)所以,这个地方要纠正我的一个错误观念,我原来认为编译gcc一定要升级glibc,其实,这个是无厘头,你要升级的是编译器,自然要用
当前的glibc来编译gcc4.7,只不过这个有时候确实比较困难而已。 十一月十八日 当前只有等待等待 十一月二十二日 当前只有等待等待 十一月二十四日 当前只有等待等待 十一月二十六日 当前只有等待等待 十二月三日 当前只有等待等待 十二月四日 当前只有等待等待 十二月十八日 当前只有等待等待
如果你还不确定升级编译器是否真的改变了glibc,不妨看看是否有升级版的libstdc++.so版本,至少我们没有看到libstdc++.a的别的版本。
故事真的结束了吗?升级了编译器静态编译依然没有解决动态库被拦截的问题,难道-W,static真的没有用?我用readefl -a
libstdc++.a | grep __cxa_throw发现有很多的UND,为什么? 用objdump -t或者nm
-u,怎么解释?我以为静态库都是obj的concatenation,一个函数在多个代码文件里反复出现是正常的,只在一个obj里有实现而已,那么静
态链接是不需要解决resolve的,所以留下了无数的空洞(UND=undefined)那么我们即便是链接静态库也不能这么作。其实,这是一个
programming
101的问题,究竟做什么才能做到静态链接呢?这个问题有那么难?问这个问题的人只有像我这样对编译原理似懂非懂的人,链接的过程就是寻找解决
(resolve)的过程,这都是发生在本地找不到的情况,在我看来静态库根本就不能作为链接的搜寻的对象,因为你根本不能动态加载,你只能把它的代码
(二进制码)作为本地的一部分进行本地的链接,所以,很正常的是把里面的obj都揭开来: ar -x libstdc++.a。
所以,最后就是要解开成一个obj来作链接,这个问题不是我天天都遇到的吗?每次都忘记。
昨天K因为健康原因离职很可惜,人的健康真的是一个人最大的财富。关于libgcc才是昨天知道的,这个gcc的编译是很庞大复杂的,足见的编译器不是任
何大公司可以轻而易举掌控的了的,需要成百的优秀的人的努力。我想重做一遍D的过程,就是把stdc++中的exception
handling部分编译到当前项目中去,我去问他的一些细节的时候,看得出他有明显的抵触情绪,我只能跟他说这和工作无关纯属个人兴趣。求人不如求己,
我压根就没有什么额外的意思。
从垃圾堆里找到了2009年做手机的小工具,是一个水波纹的实现,从哪里抄来的。
g++ -nodefaultlibs -nostdlib -shared -fPIC -static-libgcc -static-libstdc++ ./myShareLib.cpp -o myShareLib.so
寻找到了古老的收藏品,windows的秘密,1,2,3,我现在对于这个已经很陌生了。
每次使用这个作amazon S3的同步。
其实并非人人都知道的。编译器的那个所谓的personality是一个空的全局变量,如果你的程序没有用到exception的话,就可以去掉它,这样子编译的动态库就不会再依赖于默认的运行库了。
天天加班而不得。
十二月十四日是一个重要的日子。(后来想起来的。22街)
Before correcting $PS1 was:
export PS1='\e[1;32m\u@\h:\w$ \e[m'
after fix:
export PS1='\[\e[1;32m\]\u@\h:\w$ \[\e[m\]'
这里是stackoverflow最早的帖子。我的主板的hdmi输出有问题,使用双显示器第二个显示器只能接vga,第一个是dvi。 十二月二十四日 当前只有等待等待
struct A{int member1;};
static struct A a={.member1=1,}; ====>
struct A{int member1;
A():member1(1){;}};
基本上这里就是最好的解决办法了。