??xml version="1.0" encoding="utf-8" standalone="yes"?>奇米综合四色77777久久,久久WWW免费人成一看片,国产日韩久久久精品影院首页http://www.shnenglu.com/Winux32/Thinking low level, Coding high levelzh-cnWed, 07 May 2025 13:45:43 GMTWed, 07 May 2025 13:45:43 GMT60HP中国区的总裁的退休感azzhttp://www.shnenglu.com/Winux32/archive/2008/03/04/43692.htmlCharlesCharlesTue, 04 Mar 2008 08:14:00 GMThttp://www.shnenglu.com/Winux32/archive/2008/03/04/43692.htmlhttp://www.shnenglu.com/Winux32/comments/43692.htmlhttp://www.shnenglu.com/Winux32/archive/2008/03/04/43692.html#Feedback0http://www.shnenglu.com/Winux32/comments/commentRss/43692.htmlhttp://www.shnenglu.com/Winux32/services/trackbacks/43692.html  
  一、关于工作与生活
  
    我有个有的观察Q外企公司多的是25-35岁的白领Q?0岁以上的员工很少Q二三十岁的外企员工是意气风发的Q但外企公司40岁附q的l理人是很尴的。我见过?0岁附q的外企l理人大多在一直蟩槽,最后大多蟩到民企,比方_唐骏。外企员工的成功很大E度上是公司的成功,q个h的成功,襉K子的比国美大,但ƈ不代表西门子中国l理比国的老板强,甚至可以说差得很q。而进外企的h往往q不能很早理解这一点,把自q成功90Q归功于自己的能力,实际上,外企公司随便换个中国区ȝ理ƈ不会l业l带来什么了不v的媄响。好了问题来了,当这些经理h40多岁了,他们的薪资要求变得很高,而他们的才能其实又不是那么出众,作ؓ外企公司的老板Q你会怎么选择Q有的是只要不高薪水的,要出位的_明强干_֊冲沛的年MhQ有的是Qؓ什么还要用你?
    从上面这个例子,其实可以看到我们的工作轨q,二三十岁的时候,生活的压力还比较,w体q比较好Q上面的父母w体q好Q下面又没有孩子Q不用还房贷Q也没有孩子要上大学Q当个外企小白领q是很光鲜的Q挣得不多也够花了。但是hl归要结婚生子,l归会老,C40岁,父母老了Q要看病要吃药,要有人看护,自己要还房贷Q要q基本体面的生活Q要d?#8230;…那个时候需要挣多少钱才够花才重要。所以,看待工作Q眼光要放远一点,一时的谁高谁低q不能说明什么?br>    从这个角度上来说Q我不太赞成q于xW一份工作的薪水Q更没有必要攀比第一份工作的薪水Q这在刚刚出校园的学生中间是很常见的。正思h大概要工?5q_q好比是一场马拉松比赛Q和真正的马拉松比赛不同的是Q这ơ比赛没有职业选手Q每个h都只有一ơ机会。要知到Q有很多人甚臛_持不到终点,大多Ch最后是走到l点的,只有数人是跑过l点的,因此在刚开始的时候,L领先的位|ƈ没有太大的意义。刚q社会的时候如果进500强公司,大概能拿?k-6k/月的工资Q有些特别技术的人才可能可以?k/月,可问题是Q?q以后拿多少Q估?k-10k了不起了。v点虽焉Q但增幅有限Q而且Q后面的q轻赶的压力来大?br>    我前两天问我的一个销售,你会的这些东西一个新?q就都学会了Q但Ch所要求的薪水却只是你的一半,到时候,你怎么办?
    职业生Ӟ像一Z育比赛,有初赛、复赛、决赛。初赛的时候大安刚刚q社会,大多数都是实力一般的人,q时候努力一点认真一点很快就能让颖而出Q于是有的h二十多岁做了l理Q有的hq些也终于赢得了初赛Q三十多岁成了经理。然后是复赛Q能参加复赛的都是赢得初赛的Q每个h都有些能耐,在聪明才Z都不成问题,q个时候再惌胜出׃那么Ҏ了,单靠一点点努力和认真还不够Q要有很强的坚忍_Q要懂得靠团队的力量Q要懂得收服人心Q要有长q的眼光……
    看上去赢得复赛ƈ不容易,但,q不是那么难。因个世界的规律是lh一Ҏ功的同时让h骄傲自满Q刚刚赢得初赛的人往往不知道自p得的仅仅是初赛,有了一点小的成W大多Ch都会骄傲自满hQ认己已l懂得了全部Q不需要再努力再学习了Q他们会认ؓ之所以不能再q一步已l不是自q原因了。虽然他们仍然不好对付,但是他们没有耐性,没有容h的度量,更没有清晰长q的目光。就像一只愤怒的斗牛Q虽然猛烈,最l是会|的,而赢得复赛的人则象斗牛士一P不急不w,跟随着自己的节拍,慢慢耗尽Ҏ的耐心和体力。赢得了复赛以后Q大U已l是一位很了不L职业l理ZQ当上了中小公司的ȝ理,大公司的副ȝ理,ȝ着每年几千万乃臛_亿的生意?br>    最l的册来了Q说实话我自己都q没有赢得决赛,因此对于册的决胜因素也只能凭自q猜测而已Q这个时候的输赢或许像武侠说里写得那P大家都是高手Q只能等待对方犯错了Q要惌易击败对手是不可能的Q除了上浑w解敎ͼq需要一点运气和旉。世界的规律依然发挥着作用Q赢得复赛的人已l不只是骄傲自满了,他们往往刚愎自用Q听不进d人的话,有些人的脾气变得暴躁Q心情变得Qw,w体变得p糕Q他们最大的敌h是他们自己Q在册中要做的只是不被自己击|Q等着别h被自己击败。这和体育比赛是一LQ最后高手之间的比赛Q就看谁p谁p得了册?br>二?Ҏ
  
    你工作快乐么Q你的工作好么?
    有没有觉得干了一D|间以后工作很不开心?有没有觉得自己入错了行?有没有觉得自己没有得到应有的待遇Q有没有觉得工作像一团ؕL天上班都是一U痛苦?有没有很x个工作?有没有觉得其实现在的公司q没有当初想象得那么好?有没有觉得这份工作是当初因ؓ生存压力而找的,实在不适合自己Q你从工作中得到你想要得到的了么Q你每天开心么Q?br>    天上愤怒的人很多,你有没有惌Q你Z么不快乐Q你Z么愤怒?
    其实Q你不快乐的ҎQ是因ؓ你不知道要什么!你不知道要什么,所以你不知道去q求什么,你不知道q求什么,所以你什么也得不到?br>    我总觉得,职业生首先要关注的是自己,自己惌什么?大多Ch大概没想q这个问题,唯一的想法只是——我惌一份工作,我想要一份不错的薪水Q我知道所有h对于薪水的望,可是Q你x隔几q重来一ơ找工作的过E么Q你xq都在这U对于工作和薪水的焦急不安中度过么?不想的话Q就好好x楚。饮鸩止_不能因ؓ口͞拼命喝毒药。越是焦急,是觉得自己需要一份工作,饥不择食,想不清楚,容易失败,你的l历来差Q下一份工作的人看着你的历就q头。于是你喝Q越渴越喝,陷入恶性@环。最l只能哀叹世事不公或者生不逢时Q只能到天上来发泄一把,在失败者的共鸣当中L一点心理^衡Ş了。大多数人都有生存压力,我也是,有生存压力就会有很多焦虑Q积极的Z从焦虑中得到动力Q而消极的人则会因为焦虑而迷失方向。所有h都必d压力下做出选择Q这是世道Q你喜欢也Ş不喜Ƣ也|?br>    一般我们处理的事情分ؓ重要的事情和紧急的事情Q如果不做重要的事情׃常常d紧急的事情。比如锻Dn体保持健h重要的事情,而看病则是紧急的事情。如果不ȝw体保持健康Q就会常ؓ了病痛烦恹{又比如防火是重要的事情Q而救火是紧急的事情Q如果不注意防火Q就要常常救火。找工作也是如此Q想好自q竟要什么是重要的事情,扑ַ作是紧急的事情Q如果不惛_Q就会常常要扑ַ作。往往紧急的事情lh的压力比较大Q迫使h们去赶紧做,相对来说重要的事情反而没有那么大的压力,大多Ch做事情都是以压力为导向的Q压力之下,总觉得非要先做紧急的事情Q结果就是永q到处救火,永远没有停歇的时候。(很多人的工作也像是救火队一样忙痛苦,也是因ؓ工作中没有做好重要的事情。)那些说自己活在水q热ؓ了生存顾不上那么多的朋友Q今天找工作困难是当初你们没有做重要的事情,是结果不是原因。如果今天你们还是因为急于要找一份工作而不L考,那么或许来要l承受痛苦找工作的结果?br>    我始l觉得我要说的话题,沉重了点Q需要很多思考,q比唐笑打武警的话题来的枯燥乏味Q但是,天下没有L的成功,成功Q要付代仗请先忘C切的生存压力Q想惌辈子你最惌的是什么?所以,最要紧的事情,先想好自己想要什么?br>  
  三、什么是好工?br>  
    当初微Y有个唐骏Q很多大学里的年Mh觉得q才是他们向往的职业生涯,我在清华bbs里发的帖子被q些学子们所不屑Q那个时候学生们只想出国或者去外企Q不q如今看来,我还是对的,唐骏M盛大Q陈天桥创立的盛大,一家民营公司。一个高学历的v归在500强的公司里拿高薪_q大U是很多q轻人的梦想Q问题是Q每q毕业的大学生都在做q个梦,好的职位却只?00个?br>    人都是要面子的,也是喜欢攀比的Q即使在工作上也喜欢攀比,不管那是不是自己惌的。大家认为外企公司很好,可是好在哪里呢?好吧Q他们在比较好的写字|q是你想要的么?他们出差住比较好的酒店,q是你想要的么?别h会M慕一份外企公司的工作Q这是你惌的么Q那一切都是给别h看的Q你q吗要活得那么辛苦给别h看?另一斚wQ他们薪水福利一般,q没有特别了不vQ他们的晋升Z比较,很难做到很高阶的ȝQ他们虽然厌恶常常加班,却不敢不加班Q因?#8220;你不q有得是人干”Q大部分情况下会找个台湾人香港h新加坡h来管你,而这些h又往往有些莫名其妙的优感。你x楚了么?500Z定好么?扑ַ作究竟是考虑你想要什么,q是考虑别h想看什么?
    我的大学同学们大多数都到国了,甚至毕业q么多年了,q有人最q到国外M。出国真的有那么好么Q我的大学同学们Q大多数q是在博士、博士后、访问学者地挣扎着Q至今只有一个正l在一个美国大学里拿到个正式的教职。国内的教授很难当么Q我有几个表亲也M国外了,他们的父母独自在国内Q没有h照顾Q有好几ơh在家里昏倒都没h知道Q出国,真的q么光彩么?像有h说的“很多事情像看A片,看的得很爽,做的人未必?#8221;
    人L扑ֈ那个最好的Q可是,什么是最好的Q你觉得是最好的那个Q是因ؓ你的了解,q是因ؓ别h说他是最好的Q即使他对于别h是最好的Q对于你也一定是最好的么?
    对于自己惌什么,自己要最清楚Q别人的意见q不是那么重要。很多hL常常被别人的意见所影响Q亲戚的意见Q朋友的意见Q同事的意见……问题是,你究竟是要过谁的一生?人的一生不是父母一生的l集Q也不是儿女一生的前传Q更不是朋友一生的外篇Q只有你自己对自q一生负责,别h无法也负不vq个责Q。自己做的决定,臛_到最后,自己没什么可后悔。对于大多数正常智力的h来说Q所做的军_没有大的寚wQ无论怎么L选择Q都是可以尝试的。比如你没有考自׃的那个学校,没有入现在这个行业,q辈子就q不下去了?׃很失败?不见得?br>  
    我想Q好工作Q应该是适合你的工作Q具体点_应该是能l你带来你想要的东西的工作,你或许应该以此来衡量你的工作I竟好不好,而不是拿公司的大,规模Q外企还是国企,是不是有名,是不是上市公司来衡量。小公司Q未必不是好公司Q赚钱多的工作,也未必是好工作。你q是要先弄清楚你惌什么,如果你不清楚你想要什么,你就永远也不会找到好工作Q因Z永远只看C得不到的东西Q你得到的,都是你不惌的?br>   可能Q最好的Q已l在你的w边Q只是,你还没有学会珍惜。h们L盯着得不到的东西Q而忽视了那些已经得到的东ѝ?br>  
  四、普通h
  
    我发C国h的励志和国外的励志存在非常大的不同,中国的励志比较鼓׃h立下大志愿,卧薪胆Q有朝一日成富成c而国外的励志比较鼓励人勇敢面对现实生z,面对普通h的困境,虽然l果也是成富成贵Q但L不一P相对来说Q我觉得后者在操作上更现实Q而前者则需要用999个失败者来堆砌一个成功者的故事?br>    我们都是普通hQ普通h的意思就是,概率qg事是很准的。因此,我们不会买彩中500万,我们不会成ؓ比尔盖茨或者李嘉诚Q我们不会坐飞机掉下来,我们当中很少的h会创业成功,我们之中?0Q的ZdQ我们之中大部分Zz过65?#8230;…
    所以请你在惌p什么的时候,要得“现实”一点,你说我想要做李嘉诚,抱歉Q我帮不上你。成为比盖茨或者李嘉诚q种人,是靠命的Q看我写的这文章绝对不会让你成Z们,即你成Z他们Q也l对不是我这文章的功劳?#8220;王侯相宁有U乎”但真正当皇帝的只有一个hQ王侯将相,Z不多。目标定得高些对于喜Ƣ挑战的人来说有好处Q但对于大多数普通h来说Q反而比较容易灰心沮丧,很容易就攑ּ了?br>    回过头来_李嘉诚比你有钱大?0万倍,他比你更快乐么?或许。有没有比你快乐50万倍,一定没有。他比你最多也快乐一两倍,甚至有可能还不如你快乐。寻找自己想要的东西不是和别人比赛,比谁要得更多更高Q比谁的目标更远大。虽然成为李嘉诚q个目标很宏大,但你q不见得会从q个目标以及q求目标的过E当中获得快乐,而且基本上你也做不到。你必须听听你内心的声音Q寻扄正能够你获得快乐的东西Q那才是你想要的东西?br>    你想要的东西Q或者我们把它称之ؓ目标Q目标其实ƈ没有高低之分Q你不需要因q目标没有别hq大而不好意思,辑ֈ自己的目标其实就是成功,成功有大有小Q快乐却是一L。我们追逐成功,其实q逐的是成功带来的快乐Q而非成功本n。职业生涯的道\上,我们常常会被攀比的心态蒙住眼睛,忘记了追求的I竟是什么,忘记了是什么能使我们更快乐?br>    C会上一夜暴富的新闻很多Q这些消息,M在我们的心里面掀起很多涟漪,涟漪多了变成惊涛骇,心里的惊涛骇除了打L载你目标的小船,q不会得你也一夜暴富?#8220;只见贼吃肉,不见贼挨揍?#8221;我们q些普通h既没有当贼的勇气Q又~Z当贼的狠辣绝冻I虽然慕吃肉Q却更害怕挨揍,偶尔看到几个没挨揍的贼就按奈不住Q或者心思活动,或者大感不公,真要叫去做贼Q却也不敢?br>    我还是过普通h的日子,要普通h的快乐,臛_Q晚上睡得着觉?br>五、蟩槽与U篏
  
    首先要说明,工作是一仉要理智的事情Q所以不要在工作上耍个性,天上或怼有h觉得你很有个性而叫好,煤气公司电话公司不会因ؓ觉得你很有个性而免了你的帐单。当你很帅地炒掉了你的老板Q当你很酷地挖苦了一番招聘的HRQ̎单还是要照付Q只是你赚钱的时间更了Q除了你自己Q没人受损失?br>    我ƈ不反对蟩槽,但蟩槽决不是解决问题的办法,而且频繁x的后果是让h觉得没有忠诚度可aQ而且不能安心工作。现在很多h从网上找工作Q很多找工作的网站常常给人出些馊LQ要知道他们是盈利性企业,当然要从自n盈利的角度来考虑Q大家越是频J蟩槽频J找工作他们是生意兴隆Q所以鼓动h们蟩槽是他们的工作。所以他们会常常告诉你,你拿的薪水少了,你n受的利待遇差了Q又?#8220;薪情快报”又是“赞叹自由奔放的灵?#8221;。至于是否会因此让你不能安心Q你跳了槽是否解决问题,是否更加开心,那个Q他们管不着?br>    要蟩槽肯定是有问题,一般来说问题发生了Q躲是躲不开的,很多槽是因ؓq样或者那L不开心,如果q种不开心,在现在这个公怸能解冻I那么在下一个公司多半也解决不掉。你必须怿Q?0%的情况下Q你所在的公司q没有那么烂Q你认ؓ不错的公怹没有那么好。就像围城里说的Q?#8220;城里的h拼命惛_出来Q而城外的人拼命想冲进厅R?#8221;每个公司都有每个公司的问题,没有问题的公司是不存在的。换个环境你都不知道会碰C么问题,与其如此Q不如就在当下把问题解决掉。很多问题当你真的想要去解决的时候,或许q没有那么难。有的时候你觉得问题无法解决Q事实上Q那只是“你觉?#8221;?br>    人生的曲U应该是曲折向上的,偶尔会遇C谷但大趋势d是曲折向上的Q而不是象脉冲波一h每回到v点,我见q不面试者,30多岁了,四五份工作经历,每次多则3q_则1q_30多岁的时候回到v点从一个初U职位开始干P拿基本初U的薪水Q和20多岁的年Mh一L争,不觉得有点辛苦么Q这U日子好q么Q?br>    我非怸赞成在一个行业超q?q以后换行业Q基本上Q?5岁以前我们的生存资本靠打|35岁以生存的资本靠的就是积累,q种U篏包括人际关系Q经验,Q口?#8230;…如果常常更换行业Q代表几q的U篏付之东流Q一切从头开始,如果换了两次行业Q?5岁的时候大概只?q以下的U篏Q而一个没有换q行业的有?0q的U篏Q谁会占优势Q工作到2-3q的时候,很多得工作不利Q好像到了一个瓶颈,心情烦闷Q就惌职,乃至换一个行业,觉得q样所有一切烦恼都可以抛开Q会好很多。其实这样做只是让你从头开始,C时候还是会发生和原来行业一L困难Q熬q去向上跨了一大步Q要知道每个人都会经历这个过E,每个人的职业生中都会碰到几个瓶颈,你熬q去了而别人没有熬q去你就领先了。跑长跑的h会知道,开始的时候很LQ但是很快会有第一ơ的隑֏Q但q了q一D又能跑很长一D,接下来会到W二ơ的隑֏Q坚持过了以后又能跑一D,如此往复,隑֏一ơ比一ơ厉宻I直到坚持不下M。大多数人第一ơ就坚持不了了,一些h能坚持到W二ơ,W三ơ虽然大安坚持不住了,可是跑到q里的h也没几个了,q点资本_你安Exq一辈子了?br>    一份工作到两三q的时候,大部分h都会变成熟手Q这个时候往往会陷入不断的重复Q有很多Z觉得厌倦,有些Z觉得自己已经搞懂了一切,从而懒得去Lq步了。很多时候的x是因得失d了Q觉得自己已l完成比赛了。其实这个时候比赛才刚刚开始,工作两三q的人,无论是客户关p,Q手下,和领导的关系Q在业内的名?#8230;…q都是远q不够的Q但E有成W的hL会自我感觉良好的Q每个h都觉得自p客户关系铁得要命Q觉得自己在业界的口好得很。其实可以肯定地_一定不是,q个时候,q是要拿出前两年的干劲来Q稳扎稳打,U篏才刚刚开始?br>    你够了解你的客户吗Q你知道他最大的烦恼是什么吗Q你_了解你的老板么?你知道他最大的烦恼是什么吗Q你_了解你的手下么?你知道他最大的烦恼是什么吗Q如果你不知道,你凭什么觉得自己已l积累够了?如果你都不了解,你怎么能让他们帮你的忙Q做你想让他们做的事情?如果他们不做你想让他们做的事情,你又何来的成功?
  
  六、等?br>  
    q是个Qw的Z最不喜Ƣ的话题Q本来不惌q个话题Q因Z引v太多的争论,而我又无意和Z些,但是考虑到对于职业生涯的长久规划Q这是一个躲避不了的话题Q还是决定写一写,不爱看的L开吧?br>    q不是每ơ穿U灯都会被汽车撞Qƈ不是每个|犯都会被抓刎ͼq不是每个错误都会被惩罚Qƈ不是每个贪官都会被枪毙,q不是你的每一份努力都会得到回报,q不是你的每一ơ坚持都会有人看刎ͼq不是你每一点付出都能得到公正的回报Qƈ不是你的每一个善意都能被理解……q个Q就是世道。好吧,世道不够好,可是Q你有推M道的勇气么?如果没有Q你有更好的解决办法么?有很多时候,人需要一点耐心Q一点信心。每个hM轮到几次不公q的事情Q而通常Q安心等待是最好的办法?br>    有很多时候我们需要等待,需要耐得住寂寞,{待属于你的那一刅R周润发{待q,刘d华等待过Q周星驰{待q,王菲{待q,张艺谋也{待q?#8230;…看到了他们如今的功成名就的hQ你可曾看到当初他们的等待和耐心Q你可曾看到金马奖媄帝在街边摆地摊?你可曄到d云社一h在剧场里l一位观众说相声Q你可曾看到周星驰的角色甚至q一句台词都没有Q每一个成功者都有一D低沉苦L日子Q我几乎能想象得出来他们借酒愁的样子,我也能想象得Z们ؓ了生存而挣扎的H迫。在他们一生最中灿烂美好的日子里,他们渴望成功Q但却两手空I,一如现在的你。没有h保证他们来一定会成功Q而他们的选择是耐住寂寞。如果当时的他们d叨着“成功只是属于Ҏ阶?#8221;Q你觉得他们今天会怎样Q?br>    曄我也不明白有些hZ么ƈ不比我有能力却要坐在我的头上Q年U比我大׃定要当我的领gQؓ什么有些烂Z需要努力就能赚钱?Z么刚刚改革开攄时候的那么Ҏ赚钱Q而轮到我们的时候,什么事情都要正规化了?有一天我H然惻I我还在上学的时候他们就在社会里挣扎奋斗了,他们在社会上奋斗U篏了十几二十年Q我们新人来了,他们有的我都惌Q我q不是在要公qI我这是在要抢劫。因为我要得太急,因ؓ我忍不住寂寞。二十多岁的男hQ没有钱Q没有事业,却有蓬勃的欲望?br>    人L会遇到挫折的QhL会有低潮的,人L会有不被人理解的时候的QhL有要低声下气的时候,q些时候恰恰是人生最关键的时候,因ؓ大家都会到挫折Q而大多数不了q个门槛Q你能过Q你成功了。在q样的时刻,我们需要耐心{待Q满怀信心地去{待Q相信,生活不会攑ּ你,ZM来的。至,你还q轻Q你没有坐牢Q没有生M了的病,没有Ơ还不v的债。比你不q的q多q比你幸q的人,你还怕什么?路要一步步赎ͼ虽然到达l点的那一步很Ȁ动h心,但大部分的脚步是q_甚至枯燥的,但没有这些脚步,或者耐不住这些^凡枯燥,你终归是无法q来最后的那些Ȁ动h心?br>    逆境Q是上帝帮你淘汰竞争者的地方。要知道Q你不好受,别h也不好受Q你坚持不下MQ别Z一P千万不要告诉别h你坚持不住了Q那只能让别得坚持的信心Q让竞争者看着你微W的面孔Q失M心,退出比赛。胜利属于那些有耐心的h?br>    在最l望的时候,我会ȝ电媄《The Pursuit of Happyness》《JerryMaguire》,让自己重新鼓起勇气,因ؓQ无Z么时候,我们总还是有希望。当所有的人离开的时候,我不失去希望Q我不放弃。每天下班坐在R里,我喜Ƣ哼着《隐形的膀》看着H外Q我知道Q我在静静等待,{待属于我的那一刅R?br>    原脓里伊吉网友的话我很喜Ƣ,抄录在这里:
    每个人都希望Q自己是独一无二的特D?br>    含着金匙出生、投胎到好家庭、工作安排到电力局?w月薪q样的小概率事gQ当然最好轮到自?br>    U军长征两万五、打成右z֏革命、胼手胝牺牲尊严去奋斗Q最好留l祖辈父辈和别h
    自然Q不是每个吃q苦的h都会得到回报
    但是QQ何时代,每一个既得利益者n后,都有他的辈父辈奋斗挣扎乃至血付出生命的n?br>    慕别h有个好爸爸,没什么不可以
    问题是,你的下一代,会有一个好爸爸吗?
    至于问到Z么不能有同样的赢面概率?我只能问Qؓ什么物U竞争中Qh和猴子不能有同样的赢面概率?
    物竞天择。猴子的灵魂不一定比你卑微,但你w后有几十万q的cMh猿进化积淀?br>  
  七、入对行跟对?br>  
    在中国,大概很少有h是一份职业做到底的,虽然如此Q第一份工作还是有些需要注意的地方Q有两g事情格外重要Q第一件是入行Q第二g事情是跟人。第一份工作对人最大的影响是入行Q现代的职业分工已经很细Q我们基本上只能在一个行业里成ؓ专家Q不可能在多个行业里成ؓ专家。很多案例也证明即一个h在一个行业非常成功,到另外一个行业,往往完全不是那么回事情,“你想改变世界Q还是想卖一辈子汽水Q?#8221;是乔布斯邀L事可乐总裁U翰·斯考利加盟Ҏ时所说的话,l果q位在百事非常成功的U翰Q到了苹果表现^q뀂其实没有哪个行业特别好Q也没有哪个行业特别差,或许有报道说哪个行业的^均薪资比较高Q但是他们没说的是,那个行业的^均压力也比较大。看上去很美的行业一旦进入才发现很多地方其实q不那么完美Q只是外人看不见?br>    说实话,我自己都没有发大财,所以我的徏议只是让人快乐工作的Q不是如何发大胦的徏议,我们只讨Z般普通打工者的情况。我认ؓ选择什么行业ƈ没有太大关系Q看问题不能只看眼前。比如,从前q开始,国家开始整医疗行业,很多医药公司开不下去,很多医药行业的销售开始{行。其实医药行业的不景气是针对所有公司的Qƈ非针对一家公司,大家的日子都不好q,q个时候跑掉是非常不划的Q大多数正规的医药公司即使不做新生意撑个两三qL能撑的,大多数医药销售靠工资撑个两三q也是可以撑的,国家不可能永q捏着医药行业不放的,两三q以后光景dq会好v来的Q那个时候别人都跑了而你没跑Q那时的日子应该会好q很多。有的时候觉得自p个行业不行了Q问题是Q再不行的行业,做得人少了也变成了好行业Q当大家都觉得不好的时候,往往却是最好的时候。大安觉得金融行业好,金融行业门槛高不_有多h削尖脑袋要钻q去Q竞争激励,q去以后q要时时提防Q一个疏忽,p后来的hl挤掉了Q压力巨大,又如何谈得上快乐Q也未必是“?#8221;工作了?br>    太阳能这个东西至今还不能q入实际应用的阶D,但是中国已经?家和太阳能有关的公司在纽交所上市了,国美苏宁怹其实是N易型企业Q也能上市,鲁泰U织q箋10q利润增长超q?0%Q卖茶的一茶一座,卖衣服的h之家都能上市……其实选什么行业真的不重要Q关键是怎么做。事情都是h做出来的Q关键是人?br>    有一Ҏ需要记住的Q这个世界上Q有史以来直到我们能够预见得到的未来Q成功的人L数Q有q人L数Q大多数人是一般的Q普通的Q不太成功的。因此,大多Ch的做法和看法Q往往都不是距L功最q的做法和看法。因此大多数好的东西不见得好Q大多数不好的东西不见得不好。大多数人都ȝ股的时候说明跌只是旉问题Q大家越是热情高涨的时候,跌的日子近。大多数Z房子的时候,房h不会涨,而房h的差不多的时候,大多Ch才开始买房子。不会有q样一件事情让大家都变成功Q发了胦Q历史上不曾有过Q将来也不会发生。有些东西即使一时运气好得到了,q是会在别的时候别的地方失ȝ?br>    q轻人在职业生的刚开始,其要注意的是,要做对的事情Q不要让自己今后几十q的人生L提心吊胆Q更不值得Z一份工作赔上自q青春q华。我的公司是个不行較的公司,以前很多Z理解Q甚臌q员工也不理解Q不q如今,我们是同行中最大的企业Q客户乐意和我们打交道,其是在国家打击腐|的时候,每个人都知道我们做生意不l钱的名壎ͼ都敢于和我们做生意。而勇于给q公司Q不是倒了Q就是跑了,要不是每天睡不好觉Qhq是要看长远一炏V很多时候,看v来最q的路,其实是最q的路,看v来最q的路,其实是最q的路?br>    跟对人是_入行后要跟个好领导好老师Q刚q社会的人做事情往往没有l验Q需要有传n教。对于一个h的发展来_一个好领导是非帔R要的。所?#8220;?#8221;的标准,不是他让你少q活多拿钱,而是以下三个?br>    首先Q好领导要有宽广的心胸,如果一个领导每天都会发脾气Q那几乎可以肯定他不是个心胸宽广的hQ能发脾气的时候却不发脾气的领|多半是非常厉害的领导。中国h当领导最大的毛病是容忍不了能力比自己强的人,所以常常可以看到的一个现象是Q领导很有能力,手下一庸才或者手下一闲人。如果看到这L环境Q还是不要去的好?br>    其次Q领D愿意从下属的角度来思考问题,q一点其实是从面试的时候就能发现的Q如果这位领导L从自q角度来考虑问题Q几乎不听你说什么,q就危险了。从下属的角度来考虑问题q不代表同意下属的说法,但他必须了解下属的立场,下属Z么要q么惻I然后他才有办法说服你Q只兛_自己怎么想的领导往往难以获得下属的信服?br>    W三Q领导敢于承担责任,如果Z问题把责Q往下推Q有了功力_往自己w上揽,q样的领g跟也|。选择领导Q要选择关键时刻能抗得住的领|能够Z属的错误买单的领|因ؓq是他作为领导的责Q?br>    有可能,你碰不到好领|因ؓQ中国的领导往往是屁股决定脑袋的领导Q因Z坐领导的位置Q所以他的话比较有道理Q这是传l观念官本位的误区,可能有大量的q种无知无能的领|只是Q这对于你其实是好事Q如果将来有一天你要超q他Q你希望他比较聪明还是比较笨Q相Ҏ说这L领导其实不难搞定Q只是你要把自己的nD|下来而已。多认识一些hQ多和比自己强的人打交道Q同栯扑ֈ好的老师Q不要和一同样郁LZh诉社会,控诉老板Q这帮不上你Q只会让你更消极。和那些比你强的人打交道Q看他们是怎么想的Q怎么做的Q学习他们,然后跟更强的人打交道?br>八、选择
  
    我们每天做的最多的事情Q其实是选择Q因此在谈职业生涯的时候不得不提到q个话题?br>    我始l认为,在很大的范围内,我们I竟会成Z个什么样的hQ决定权在我们自己,每天我们都在做各U各L选择Q我可以不去写这文章,d人的帖子拍拍砖头Q也可以写下q些文字Q帮助别人的同时也整理自q思\Q我可以多注意下格式让别人易于阅读,也可以写成一堆,我可以就q样发上来,也可以在发以前再看几遍,你可以选择不刮胡子去面试Q也可以选择出门前照照镜?#8230;…每天Q每一L们都在做q样那样的决定,我们可以漫不l心Q也可以多花些心思,成千上万的小选择累计hQ就军_了最l我们是个什么样的h?br>    从某U意义上来说我们的未来不是别人给的,是我们自己选择的,很多Z说我命苦啊,没得选择阿,如果你认?#8220;d软还是去IBM”“上清华还是上北大”“当销售副总还是当厂长”q种才叫选择的话Q的你没有什么选择Q大多数人都没有什么选择。但每天你都可以选择是否为客h务更周到一些,是否对同事更耐心一些,是否把工作做得更l致一些,是否把情况了解得更清楚一些,是否把不清楚的问题再弄清楚一?#8230;…你也可以选择在是否在痛苦中l坚持,是否抛弃掉自q那些负面的想法,是否原谅一个h的错误,是否怿我在q里写下的这些话Q是否不要再犯同L错误……生活每天都在l你选择的机会,每天都在l你改变自己人生的机会,你可以选择赖在C撒泼打滚Q也可以选择咬牙站v来。你永远都有选择。有些选择不是立杆见媄的,需要篏U,比如农民可以选择自己常常L圎ͼ也可以选择让老天L圎ͼ诚然你今天浇水下去苗不见得今天马上就长出来,但常常浇_大部分苗l究会长出来的,如果你不,收成一定很p糕?br>    每天生活都在l你ZQ他不会l你一叠现金也不会拱手送你个好工作Q但实际上,他还是在l你Z。我的家庭是一个普通的家庭Q没有Q何了不v的社会关p,我的父亲在大学毕业以后就被分配到了边疆,那个县城只有一条马路,他们那一代h其实比我们更有理由抱怨,他们什么也没得刎ͼq轻的时候文化大革命Q书都没得读Q支援边疆插队落P{到老了Q却要给q轻人机会了。他有够的理由象成千上万那L青年一样坐在那里抱怨生不逢时Q怨气冲天。然而在分配到边疆的十年之后Q国家恢复招研究生,他考回了原来的学校。研I生毕业Q他被分配到了安徽一家小单位里,又是3q以后,国家W一届招收博士生Q他又考回了原来的学校Q成Z国第一代博士,那时的他比现在的我年U还大。生zdƈ没有攑ּ他,他也没有攑ּ生活?0q的{待Q他做了他自q选择Q他没有攑ּQ他没有破罐子破摔,所以时机到来的时候,他改变了自己的h生。你最l会成ؓ什么样的hQ就军_在你的每个小的选择之间?br>    你选择怿什么?你选择和谁交朋友?你选择做什么?你选择怎么做?……我们面太多的选择Q而这些选择当中Q意识Ş态层面的选择又远比客观条件的选择来得重要得多Q比如选择做什么品其实ƈ不那么重要,而选择怎么做才重要。选择用什么hq不重要Q而选择怎么带这些h才重要。大多数时候选择客观条gq不要紧Q大多数关于客观条g的选择q没有对错之分,要紧的是选择怎么做。一个大学生毕业了,他要d软也好,他要卖猪肉也好,他要创业也好Q他要做游戏代练也好Q只要不犯法Q不害hQ都没有什么关p,要紧的是Q选择了以后,怎么把事情做好?br>    除了q些Q你q可以选择旉和环境,比如Q你可以选择把这辈子最大的困难攑֜最有体力最有精力的时候,也可以走一步看一步,{到?0岁再_只是C40多岁Q那正是一辈子最脆弱的时候,上有老下有小Q如果在那个时候碰上了职业危机Q实在是一件很苦恼的事情。与其如此不如在20多岁30多岁的时候吃点苦Q好让自pq时候活得从容一些。你可以选择在温室里成长Q也可以选择到野外磨砺,你可以选择在办公室吹冷气的工作Q也可以选择40度的L下,去见你的客户Q只是,q一切最l会累积hQ引gC应得的未来?br>    我不敢说所有的事情你都有得选择Q但是绝大部分事情你有选择Q只是往往你不把这当作一U选择。认真对待每一ơ选择Q才会有比较好的未来?br>  
  九、选择职业
  
    职业的选择Qȝ来说Q无非就是销售、市场、客服、物、行ѝh事、胦务、技术、管理几个大c,有个有趣的现象就是,500强的CEO当中最多的是销售出w,W二多的人是财务nQ这两者加h大概过95Q。现代IT行业也有技术出w成板的,但实际上Q后来他们还是从事了很多销售和市场的工作,q且表现Q公司才获得了成功,完全靠技术能力成为公司老板的,几乎没有。这是有原因的,因ؓ销售就是一门跟人打交道的学问,而管理其实也是跟人打交道的学问,q两者之中有很多盔R的东西Q他们的共同目标是“让别人去做某件特定的事情?#8221;而胦务则是从数字的层面了解生意的本质Q从宏观上看待生意的本质Q对于一个生意是否挣钱,是否可以正常q作有着最深刻的认识?br>    公司的时候是销售主导公司,而公司大的时候是财务d公司Q销售的局限性在于只看h情不看数字,财务的局限性在于只看数字不看h情。公司初期,q营成本低,有订单就zd下去Q跟客户也没有什么谈判的条gQ别l生意做已经谢天谢地了,q个时候订单压倒一切,客户的要求压倒一切,所以当然要h情。公司大了以后,一切都要规范化Q免得因Z规范引v一些不必要的风险,同时q营成本也变高,必须提高利润率,把有限的资金攑ֈ最有出的地方。对于上市公司来_股东才不你客户是不是最q出国,最q是不是那个省又在搞严打Q到了时候就要把业W拿出来,拿不出来抛股票Q这个时候就是数字压倒一切?br>    前两天听到有一句话觉得很有道理Q开始的时候我们想“能做什么?”Q等到公司做大了有规模了Q我们想“不能做什么?#8221;很多人在工作中觉得ؓ什么领D么保守,q也不行那也不行Q错q很多机会。很多时候是因ؓQ你q年轻,你想的是“能做什?#8221;Q而作为公叔RD考虑的方面很多,他比较关?#8220;不能做什?#8221;?br>    我ƈ非鼓吹大安d销售或者胦务,I竟选择什么样的职业,和你I竟要选择什么样的h生有关系Q有些h喜Ƣ下班按时回Ӟ看看书听听音乐,那也挺好Q但׃适合找个销售的工作了,否则会是折磨自己。有些h喜Ƣ出风头Q喜Ƣ成Zh的中心,如果选择做胦务工作,大概也干不久Q因Z般老板不喜Ƣ胦务太U极Q也不喜Ƣ胦务话太多。先惛_自己要过怎样的h生,再决定要找什么样的职业。有很多的不快乐Q其实是源自不满I而不满Q很多时候是源自于心不定Q而心不定则是因ؓ不清楚究竟自p什么,不清楚要什么的l果是什么都惌Q结果什么都没得到?br>    我想Q我们还是因为生z而工作,不是因ؓ工作而生z,生活是最要紧的,工作只是生活中的一部分。我L觉得生活的各Ҏ面都是相互媄响的Q如果生zLw一团ؕ麻,工作也不会顺利。所以要有娱乐、要有社交、要ȝw体Q要有和睦的家庭……最要紧的,要开心,我的两个销售找我聊天,一肚子苦水Q我问他们,2q以前,你什么都没有Q工资不高,没有客户关系Q没有业l,处于被开的边~,现在的你比那时条件好了很多,Z么现在却更加不开心了Q如果你做得好不开心,那你Z么还要工作?首先的首先,是要让自己高兴v来,让自己心态好hQ这U发自内心的改变会让你更有耐心Q更有信心,更有气质Q更能包?#8230;…否则Q看看镜子里的你Q你满意么?
    有h会说Q你说得ҎQ我每天加班Q不加班老板׃把我炒掉Q每天篏得要死,哪有旉׃、社交、锻|那是Z把目标设定太高的~故Q如果你q在动不动就会被老板炒掉的边~,那么你当然不能设立太高的目标Q难道你q想每天L高尔夫?你没旉dw房ȝw体Q但是上下班的时候多走几步可以吧Q有楼梯的时候走走楼梯不走电梯可以吧Q办公的间隙扭扭脖子拉拉肩膀做做俯卧撑可以吧Q谁规定ȝ׃定要拿出每天2个小时去健n房?你没旉C交Q每月参加郊怸ơ可以吧Q周末去参加个什么音乐班Q绘ȝ之类的可以吧Q去试认识一些同行,和他们找Z交流交流可以吧?开始的时候L有些隄Q但q出q一步就会向良性@环的方向发展。而每天工作得很苦P剩下的时间用来咀DP只会陷入恶性@环,让生zL加糟p?br>  
  虽然d惠普仅有十五天,但感觉上惠普已经L很远。我的心思更多放在规划自q二阶D늚人生Q这q代表我对惠普没有MhQ主要还是想以此驱动自己往前走?br>    万科王石ȝI朗玛峰的体验给我很多启发,虽然在出发时携带大量的物资,但是登顶的过E中Q必M断减轻负P最l只有一个氧气瓶和他M峰顶。登山如此,漫长的h生又何尝不是?br>    我宣布退休后Q接到同事朋友同学的贺。大部分人都认ؓ我能够在q样的职位上及年龄选择退休,是一U勇气,也是一U福气?
    q有一部分人怀疑我只是借此Z换个工作Q当然还有一些h说我在HP做不下去了,此Zd?br>    我多q来已经习惯别hҎ的说三道四,但对于好友,我还是挺兛_大家是否真正理解我的xQ这也是写这文章的目的?br>    ׃受我父亲早逝的影响Q我很早׃定决心,要在有生之年实现自己的愿望,我不要像我父亲一P为家庭生zd一辈子Q;l前感伤Q懊D己有很多没有实现的理惟?br>    一本杂志的文章提到我们在生前就应该思考自q墓志铭,因ؓ那代表你自己对完h生的定义Q我们应该尽可能在有生之q去实现它?br>    我希望我的墓志铭上除了与家h及好友有关的内容外,是这样写着Q?br>    1.q个人曾l服务于一家全球最大的IT公司QHPQ?5q_和她一L历过数次重大的变革,看着她从以电子A表ؓ主要的业务变革成全球最大的IT公司?br>    2.q个人曾l在全球发展最快的国家Q中国)工作16q_q担任HP中国区总裁7q_见证及经历过中国攚w开攄关键最新突破阶D,与中国一hѝ?br>    3.q个人热爱飞行,曄是一个有执照的飞行员Q篏U飞行时数超qX时Q曾l在X个机v降过?br>    4.q个人曾l获得管理硕士学位,在领导管理上特别x中国企业的组l行为及l效Qƈ且在q个领域上获得中国企业界的认可?br>    我费?5q才ȝ1?两项成果Q我不知q要Ҏ多久才能达成3?的愿望,特别是第4个愿望需要经历学术的训练Q才能将我的l验ȝ成知识?br>  否则我的l验无法有效媄响及传授他h。因此重新进入学校学习,拿一个管理学位是有必要的Q更何况q是我一个非帔R要的愿望?br>    另一斚wQ我25q的旉都花在运?operation)的领域,兢兢业业的做好职业h士的工作Q它是一份好工作Q特别是在HPQ这份工作也帮助我徏立胦务的基础Q支持家庭的发展?br>    但是我不想终其一生,都陷入在q营的领域,我想象企业家一P有机会靠一些点?ideas)赚钱Q虽焉险很高,但是值得一试,即p|Q也不枉C回,q也是第4个愿望其中的一部䆾?br>    Carly Fiorina曄Ҏ说过“q个世界上有好想法的人很多,但有能力d现的人很?#8221;Q?007q??1日在北大演讲Ӟ有h问v那些书对我媄响较大,我想Ҏ人生观有影响的其中一本书?#8220;TriggerPoint”Q它的主要观ҎQh生最需要的不是规划Q而是在适当的时机掌握机会,采取行动?br>    我这些愿望在我心中已l酝酿一D很长的旉Q开始的时候,也许一q想个一两次Q过了也忘掉,但逐渐的,q个心中的声韻I愈来愈大Q出现的频率也愈来愈高,当它几乎每一个星期都会来与我对话Ӟ我知道时机已l成熟?br>    但和MZP要丢掉自q在所拥有的,所熟悉的环境及E_的收入,转到一条自己未曄历过Q存在未知风险的道\Q需要绝大的勇气Q家人的支持和好友的鼓励。有舍才有得Q真是知易行难,我很高兴自己l于跨出了第一步?br>    我要感谢HP的EER提前退休优惠政{,它是其中一个关键的TriggerPoints,另一个关键因素是在去q五六月发生的事?br>    当时我家老大从大学毕业,老二从高中毕业,在他们l工作及求学前,q是一个黄金时D,让我们全家可以相聚一D较长的旉Q我为此很早p划休一个长假,带着他们到各地游玩?br>    但这个计划因为工作上一仉要的事情QMark Hurd访华Q不得不取消。这个事件刺Ȁ了我必须严肃的去对待那心中的声音Q我会不会l不断的错失很多关键的机?
    我已l年q?0Q我会不会走向和我父亲一L道\Qh事部老总Charles跟我_很多人在所有对他有利的星星都排成一列时Q还是错失时机?br>    我知道原因,因ؓ割舍及改变对人是多么的困难,我相信大部分的h都有自己人生的理惻I但我也相信很多h最l只是把q些理想当成?br>    qLQ然后不断的己寻找不能实现的藉口Q南非前ȝ曼d拉曾l说q,“与改变世界相比,改变自己更困?#8221;Q真是一针见血?br>    什么是快乐及有意义的h生?我相信每一个h的定义都不一PҎ来说Q能实现我墓志铭上的内容是我的定义?br>    在中国惠普总裁的位|上固然可以吸引很多的关注及眼球Q但是我太太及较亲近的好友,都知道那不是我追求的Q那只是为扮演好q个角色必须力做好的地斏V?br>    做一个没有名片的人士Q虽然只有十多天的时_但我发现我的脑袋里已l空出很多空间及能量Q让我可以静心的为我ChapterII的新生活做细致的调研及规划?br>    我预订以两年的时间来完成转轨的准备工作,q且花多Ҏ间与家h共处。这两年的时间我希望拿到飞行执照Q拿到管理有关的士学位Q提升英文的水^Q徏立新的网l,多认识不同行业的人,保持与大陆的联系。希望两q后Q我可以利回到大陆d现我W四个愿望?br>    毫不意外Q在生活上,我发现很多需要调整的地方?br>    二十多年来,我生zȝ步调及节奏,几乎完全被公司及工作所左右Q不断涌出的deadline及Q务驱动我每天的安排,一旦离开q样的环境,W一个需要调整的是要依靠自q自律及意志力来驱动每天的zdQ睡觉睡到自焉的态度l对不正,放松自己Q不l事情设定目标及旉表,或者对错失旉目标无所谓,也不正确Q没有年度,季度Q月及周计划也不正确?br>    担Q高层l理多年Q已l养成交待事情的习惯Q自q旉主要花在思考,决策及追t项目的q展情况Q更多是依靠一个庞大的团队来执行具体的事项及秘书来处理很多协调及繁琐的事情?br>    到美国后Q很多事情需要打800L话联p,但这些电话很忙,常让你在waitingline上等待很长的旉Q当我在{待Ӟ我可以体会以前秘书工作辛苦的地方Q但同时也提醒我自己Q在q个阶段要改变态度Q培L大的耐性及自己动手做的能力?br>    生活的内容也要做出很大的调整Q多出时间锻Dn体,多出旉x家hQ多出时间关注朋友,多出旉体验不同的休闲活动及飞行Q一步步的,希望生活逐步调整到我所期望的轨道上Q期待这两年的生zL充实又充满乐及意义?br>    W一个快乐的体验是准备及参加大儿子的订婚礼Q那U全心投入,不需担忧工作数字的感觉真好。同时我也租好了公寓Q买好了家具及R子,陪家人在周末的时候到Reno及Lake Tahoe玩了一,LakeTahoe我去了多ơ,但这ơ的体验有所不同Q我从心里欣赏到它的丽?br>    但同时我也在加紧调研的工作,为申请大学及飞行学校做准备,q段旉也和在硅L朋友及一些风险投资公司见面,了解不同的业?br>    我的人生观是“完美的演出来自充分的准备”Q?#8220;勇于改变自己Q适应不断变化的环境,Z不断出?#8221;Q?#8220;快乐及有意义的h生来自于实现自己心中的愿望,而非外在的掌?#8221;?br>    我离开Ӟ有两位好朋友送给我两个不同的语QBaron的是“多年功过化烟?#8221;Q杨华的?#8220;莫春者,风乎舞雩Q咏而归”Q它们分别代表了我离开惠普及走向未来的心情?br>    我ȝ人生有三个阶D,一个阶D|为现实找一份工作,一个阶D|为现实,但可以选择一份自己愿意投入的工作Q一个阶D|为理惛_做一些事情?br>    我珍惜我的福气,感激HP及同事、好朋友l我的支持,鼓励及协助,q篇文字化我心声的文章与好友分n?br>

Charles 2008-03-04 16:14 发表评论
]]>
2008.02.01工作日记http://www.shnenglu.com/Winux32/archive/2008/02/01/42334.htmlCharlesCharlesFri, 01 Feb 2008 04:16:00 GMThttp://www.shnenglu.com/Winux32/archive/2008/02/01/42334.htmlhttp://www.shnenglu.com/Winux32/comments/42334.htmlhttp://www.shnenglu.com/Winux32/archive/2008/02/01/42334.html#Feedback0http://www.shnenglu.com/Winux32/comments/commentRss/42334.htmlhttp://www.shnenglu.com/Winux32/services/trackbacks/42334.htmlVS2005的solution文g通过W二行的字串“#Vistual Studio 2005”来识别,如果在checkin到CVSӞsln文gdos2unix了,?D0A被{?AQ估计微软识别此行时用memcmpq同0D0A一同比较,所以不能自动打开了。将其unix2dos一下就解决了?br>
2. 查看Linux 发行版版?br>通用办法 cat /etc/issue

3. putty屏幕列?br>Alt?鼠标

Charles 2008-02-01 12:16 发表评论
]]>
COFF格式l篇—Lib文g的结构zzhttp://www.shnenglu.com/Winux32/archive/2007/07/19/28363.htmlCharlesCharlesThu, 19 Jul 2007 08:54:00 GMThttp://www.shnenglu.com/Winux32/archive/2007/07/19/28363.htmlhttp://www.shnenglu.com/Winux32/comments/28363.htmlhttp://www.shnenglu.com/Winux32/archive/2007/07/19/28363.html#Feedback1http://www.shnenglu.com/Winux32/comments/commentRss/28363.htmlhttp://www.shnenglu.com/Winux32/services/trackbacks/28363.html    库文件是怎么Ll构呢?
    其实Q库文g的结构也很简单。它是“一?#8221;目标文g的集合。把目标文g做成库以后,我们在用目标文件中所实现的功能时Q连接程序会自动在库文g里查扄应的目标文gQƈ使用它。这大大减少了我们对目标文g的管理工作,减轻了代码重用的负担?br>    Lib文g中的?/strong>
    COFF格式中所用到?#8220;?#8221;的概念再ơ出现在Lib格式中。不q,Lib文g的节要简单得多。先让我们来看看它的整体l构Q?br>
    如右图所C:
    Lib格式只有四种cd的节QSectionQ,即First SecQSecond SecQLongname Sec和Obj SecQ其中Second Sec与Longname Sec是可选节Q很多Lib文g中都没有。而开头的Singature只是一个标识,它相当于COFF目标文g中的法数字。它是一个长度ؓ8的字W串Qgؓ“!<arch>\n”?br>    First SecQ顾名思义Q就是第一个节。它包含了库中所有的W号名以及这些符h在的目标文g在库中的位置Q绝对偏U)?br>    Second Sec是W二节。它的内容和First Sec是相同的。不同的是,Second Sec是一个有序表Q通过它来查找库中的符h通过First Sec来查找要快很多?/td>
Signature
First Sec
Second Sec
Longname Sec
Obj Sec1
Obj Sec2
……










    Longname Sec是长名称节。这一节是一个字W串表。它包含了所有长目标文g名。如果后面的Obj Sec中没有给出相应的目标文g名,我们p到这一节中来查找?br>    Obj Sec是目标文g节。这些节中存储着不同的目标文件的原始数据?/div>
 
    在库文g中,每一节都有两个部分。一个部分是_另一个部分才是该节的数据Q数据紧跟在头的后面。头描述了该节数据的cd、长度等信息。这些头的格式都是相同的。其l构用C语言描述如下Q?br>    typedef struct {
        char Name[16];      // 名称
        char Time[12];      // 旉
        char UserID[6];     // 用户ID
        char GroupID[6];    // lID
        char Mode[8];       // 模式
        char Size[10];      // 长度
        char EndOfHeader[2];// l束W?br>    } SectionHeader;
    可以看到Q头中的数据全都是字W串。用字符串的好处是可以提高格式的兼容性,因ؓ在不同的机器上,数据的排列方式是不同的。有的机器是以Little-Endian方式工作Q还有的是以Big-Endian方式工作Q它们互不兼容(q两U方式的区别Q?L我的《COFF格式》一文,其中的文件头一节有说明Q。用字符串就不会有这U问题(后面我们会遇到Q。但它也有不方便的地方,是必须把字W串转换成数|多了一个步骤?br>    在这个结构中Q最常用的Name、Size以及EndOfHeader三个成员。Name是节的名称啦!Size也很好理解,是该节数据的长度。现在要注意的就是这个EndOfHeader成员了!q个成员标志着头的l束Q其内容?#8220;`\n”Q注意,q里没有打错Q是两个字符“`”?#8220;\n”Q。怎么P有点奇怪吧Qؓ什么要有这个结束符Q每一节的头长度一定,每节中的数据长度也知道。按序向下M行吗Q答案是Q不行!因ؓ每一节之间存在间隙!通常是一个字节或零个字节。如果是零个字节倒好Q按序向下LOK的。可是如果不为零的话Q这栯p错位了。要知道错位没有Q只好用一个结束符来定位了。如果在d的时候发现结束符不对Q那p一个字节一个字节地向下查找Q直到找到结束符Q才能算是对齐了。切讎ͼ切记Q?br>    当然Q通过First Sec或Second Sec中给出的偏移来读数据׃存在q个问题。不会发生错位,攑ֿdQ?br>    现在让我们来看看每一节中的数据是什么样子?/div>
 
    First Sec
    W一节,通常是Lib中的每一个小节。它的名U是“/”。其数据部分的结构如下:
    typedef struct {
        unsigned long SymbolNum;         // 库中W号的数?br>        unsigned long SymbolOffset[n];   // W号所在目标节的偏U?br>        char StrTable[m];                // W号名称字符串表
    }FirstSec;
    W一个成员SymbolNum是符L数量。注意!它是以Big-Endian方式储存的(x86q_上的数据是以Little-Endian方式储存的。这里应该注意{换。后面给出的convert函数可以在Little-Endian格式与Big-Endian格式之间q行怺转换Q?br>    W二个成员SymbolOffset是一个数l,它的长度n是W号的数量,也就是SymbolNum。这个数l储存了每一个符h在的目标节的偏移。我们可以方便地通过它来查找W号所在的目标文g。注意!它也是以Big-Endian格式储存的?br>    W三个成员StrTable是一个字W串表,它的长度m是SectionHeader.Size的值减去(SymbolNum+1Q?4。其l构很简单,是一堆以‘\0’l尾的字W串Q和COFF文g中的字符串表l构相同Q。在有的pȝ中,它还可能是以“/\n”q两个字W结字符串的集合?br>    很简单的一个结构,不过有两个成员的长度是不定的。怎么才能方便CLib中读些数据,留给大家自己惛_Q下面我只给Z个进行Little-Endian与Big-Endian互{的函数?br>    inline void convert(void * p          // 要{换的数据的指?br>                        ,size_t size = 4  // 数据的长度,long?Qshort?
                        ) {
        char * buf=(char*)p;
        char temp;
        for ( size_t i=0;i<size/2;i++ ) {
            temp=buf[i];
            buf[i]=buf[size-i-1];
            buf[size-i-1]=temp;
        }
    }
 
Second Sec
    现在看看W二节?br>    q一节与W一节很怼Q它通常也就是Lib文g的第二个节。它的名字也?#8220;/”Q注意:文g中第一个叫“/”的节是第一节,W二个就是第二节Q。不q它的结构与W一节有些不同,如下Q?br>    typedef struct {
        unsigned long ObjNum;        // Obj Sec的数?br>        unsigned long ObjOffset[x];  // 每一个Obj Sec的偏U?br>        unsigned long SymbolNum;     // 库中W号的数?br>        unsigned short SymbolIdx[n]; // W号在ObjOffset表中的烦?br>        char StrTable[m];            // W号名称字符串表
    }SecondSec;
    W一个成员ObjNum是库中Obj Sec的数量?br>    W二个成员ObjOffset是一个偏U表Q它记录了库中所有Obj Sec的偏UR这个表的记录数x是ObjNum?br>    W三个成员SymbolNum与First Sec中的SymbolNum意义相同?br>    W四个成员SymbolIdx变成了一个烦引,它记录了相应名称字符串在ObjOffsetq个表中的位|,我们要通过两次索引才能扑ֈ我们所要符LObj Sec位置。它的项目数n为SymbolNum。但h意,q个索引是unsigned short型,不再是unsigned long型?br>    W五个成员StrTablel构与First Sec中的一栗不q,它的长度m为SectionHeader.Size的值减?(ObjNum+1)*4+(SymbolNum+2)*2)?br>    值得注意的是Q这里的所有数据都是Little-Endian格式的。千万不要弄错了Q?br>
Longname Sec
    q个节是一个字W串表,它的名称?#8220;//”Q其l构同FirstSec.StrTable。这里就不多说了?br>
Obj Sec

    q一节中的数据就是COFF文g的原始数据,把它d来存成文Ӟ是一个COFF文g。它的格式请参考《COFF格式》一文?br>    要指出的是它的命名方式有些特D。如果Obj文g的名U少?6个字W,它就会被保存在SectionHeader的Name成员中,?#8216;/’字符l尾。如果无法保存在Name成员中,则Name成员的第一个字W就?#8216;/’Q之后再跟上q个名称在Longname Sec中的偏移?br>
例如
Q?br>!<arch>\n
……
LongName Sec:
This_Is_Long_Name0001\0
This_Is_Long_Name0002\0
……
Obj Sec1:
 Name[16]Q?#8220;shortname/”
 ……
Obj Sec2:
 Name[16]Q?#8220;/0”  // q里使用了第一个长文g名This_Is_Long_Name0001
 ……
Obj Sec3:
 Name[16]Q?#8220;/22”  // q里使用了第二个长文件名This_Is_Long_Name0002
 ……
 
    OKQ现在已l介l完了Lib文g的结构。大家的q接器可以加新功能了。不q这里只l出了最基本的Lib文gl构Q动态连接库QDLLQ的导出库有点特别,我将在PE文g格式中进行详l介l?/div>

Charles 2007-07-19 16:54 发表评论
]]>COFF文g的格式zzhttp://www.shnenglu.com/Winux32/archive/2007/07/19/28362.htmlCharlesCharlesThu, 19 Jul 2007 08:52:00 GMThttp://www.shnenglu.com/Winux32/archive/2007/07/19/28362.htmlhttp://www.shnenglu.com/Winux32/comments/28362.htmlhttp://www.shnenglu.com/Winux32/archive/2007/07/19/28362.html#Feedback0http://www.shnenglu.com/Winux32/comments/commentRss/28362.htmlhttp://www.shnenglu.com/Winux32/services/trackbacks/28362.html    当然Qƈ不是只有q一U对象文件格式。常用格式的q有OMF-对象模型文gQObject Module FileQ以及ELF-可执行及q接文g格式QExecutable and Linking FormatQ。OMF是一大群IT巨头在nq制定的一U格式,在Windowsq_上很常见。大家喜Ƣ的Borland公司现在使用的目标文件就是这U格式。MS和Intel在nq前用的也是q种格式Q现在都Ҏ异侧Q用COFF格式了。ELF格式在非Windowsq_上用得比较多,在Windowsq_基本上没见过。做为程序员Q很有必要认识一下这些你l常打交道的家伙Q不q这ơ让我介lCOFF先!
 
    COFF的文件结?br>    让我们先来看一下COFF文g的整体结构,看看它到底长得什么样Q?/div>

File Header

Optional Header

Section Header 1

......

Section Header n

Section Data

Relocation Directives

Line Numbers

Symbol Table

String Table

如左图:
COFF文g一共有8U数据,自上而下分别为:
1. 文g_File HeaderQ?br>2. 可选头QOptional HeaderQ?br>3. D落_Section HeaderQ?br>4. D落数据QSection DataQ?br>5. 重定位表QRelocation DirectivesQ?br>6. 行号表(Line NumbersQ?br>7. W号表(Symbol TableQ?br>8. 字符串表QString TableQ?/td>
    其中Q除了段落头可以有多个节Q因为可以有多个D落Q以外,其它的所有类型的节最多只能有一个?br>    文g_֐思义Q它是COFF文g的头Q它用来保存COFF文g的基本信息,如文件标识,各个表的位置{等?br>    可选头Q再֐思义Q它也是一个头Q还是可选的Q而且可有可无。在目标文g中,基本上都没有q个_但在其它的文件中Q如Q可执行文gQ这个段用来保存在文件头中没有描q到的信息?br>    D落_又顾……Q不了Q再有打我?span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-char-type: symbol; mso-symbol-font-family: Wingdings">JQ,q个_怎么q么多的头啊Q!Q是用来描述D落信息的,每个D落都有一个段落头来描q。段落的数目在文件头中会指出?br>    D落数据Q这通常是COFF文g中最大的数据D,每个D落真正的数据就保存在这个位|。至于怎么区分q些数据是哪个段落的Q不要问我,去问D落头?br>    重定位表Q这个表通常只存在于目标文g中,它用来描qCOFF文g中符L重定位信息。至于ؓ什么要重定位,请回家看看你的操作系l的书籍?br>    W号表:q个表用来保存COFF文g中所用到的所有符L信息Q连接多个COFF文gӞq个表帮助我们重定位W号。调试程序时也要用到它?br>    字符串表Q不用我_大家也知道它用来保存字符串的。可是字W串保存l谁看呢Q不知道了吧Q?问我啊!JW号表是以记录的形式来描q符号信息的Q但它只为符号名U留|了8个字W的I间Q早期的程序还就能行Q可在现在的E序中,一个符号名动不动就数十个字W,8个字W怎么能够Q没办法Q只好把q些名称存在字符串表中。而符可中只记录q些字符串的位置?br>    文g的结构大体上是q样了。长得是丑了点,不过q算它的设计者有点远见。可扩充性设计得不错Q以致于沿用至今。了解了文g的整体结构,现在让我们来逐个D落分析它?br>
    文g?/strong>
    文g_自然是从文g?偏移处开始,它的l构很简单。用C的结构描q如下:
typedef struct {
  unsigned short usMagic;  // 法数字
  unsigned short usNumSec;  // D落QSectionQ数
  unsigned long  ulTime;  // 旉?br>  unsigned long  ulSymbolOffset;  // W号表偏U?br>  unsigned long  ulNumSymbol;  // W号?br>  unsigned short usOptHdrSZ;  // 可选头长度
  unsigned short usFlags;  // 文g标记
} FILEHDR;
    l构中usMagic成员是一个魔法数字(Magic NumberQ,在I386q_上的COFF文g中它的gؓ0x014c。如果COFF文g头中法数字不ؓ0x014cQ那׃用看了,q不是一个I386q_的COFF文g。其实这是一个^台标识?br>    W二个成员usNumSec是一个无W号短整型,它用来描q段落的数量。段落头QSection HeaderQ的数目是它?br>    ulTime成员是一个时间戳Q它用来描述COFF文g的徏立时间。当COFF文gZ个可执行文gӞq个旉戳经常用来当做一个加密用的比Ҏ识?br>    ulSymbolOffset是符可在文件中的偏U量Q这是一个绝对偏U量Q要从文件头开始计数。在COFF文g的其它节中,也存在这U偏U量Q它们都是绝对偏U量?br>    ulNumSymbol成员l出了符可中符可录的数量?br>    usOptHdrSZ是可选头的长度,通常它ؓ0。而可选头的类型也是从q个长度得知的,针对不同的长度,我们p选择不同的处理方式?br>    usFlag是COFF文g的属性标讎ͼ它标识了COFF文g的类型,COFF文g中所保存的数据等{信息?br>    其值如下:
?/td> 名称 说明
0x0001 F_RELFLG 无重定位信息标记。这个标记指出COFF文g中没有重定位信息。通常在目标文件中q个标记们ؓ0Q在可执行文件中??
0x0002 F_EXEC 可执行标记。这个标记指?COFF 文g中所有符号已l解析, COFF 文g应该被认为是可执行文件?
0x0004 F_LNNO 文g中所有行号已l被L?
0x0008 F_LSYMS 文g中的W号信息已经被去掉?
0x0100 F_AR32WR 些标记指出文件是 32 位的 Little-Endian COFF 文g?
    注:Little-EndianQ记不得它的中文名称了。它是指数据的排列方式。比如:十六q制?x1234以Little-Endian方式在内存中的顺序ؓ0x34 0x12。与之相反的是Big-EndianQ这U方式下Q在内存中的序?x12 0x34?br>q个表的内容q不全面Q但在目标文件中Q常用的也就只有q些。其它的标记我将在以后介lPE格式时给出?br>可选头
    可选头接在文g头的后面Q也是从COFF文g?x0014偏移处开始。长度可以ؓ0。不同长度的可选头Q其l构也不同。标准的可选头长度?4?8字节Q通常?8啦。这里我只介绍长度?8的可选头。(因ؓq种头的长度是自定义的,不同的h定义的结果就不一P我只能选一U最常用的头来介l,别的我也不知道)
q种头的l构如下Q?br>typedef struct {
  unsigned short usMagic;  // 法数字
  unsigned short usVersion;  // 版本标识
  unsigned long  ulTextSize;  // 正文QtextQ段大小
  unsigned long  ulInitDataSZ;  // 已初始化数据D大?br>  unsigned long  ulUninitDataSZ;  // 未初始化数据D大?br>  unsigned long  ulEntry;  // 入口?br>  unsigned long  ulTextBase;  // 正文D基址
  unsigned long  ulDataBase;  // 数据D基址Q在PE32中才有)
} OPTHDR;
    W一个成员usMagicq是法数字Q不q这回它的值应该ؓ0x010b?x0107。当gؓ0x010bӞ说明COFF文g是一个一般的可执行文Ӟ当gؓQ?x0107ӞCOFF则ؓ一个ROM镜像文g?br>    usVersion是COFF文g的版本,ulTextSize是这个可执行COFF的正文段长度QulInitDataSZ和ulUninitDataSZ分别为已初始化数据段和未初始化数据段的长度?br>    ulEntry是程序的入口点,也就是COFF载入内存时正文段的位|(EIP寄存器的|Q当COFF文g是一个动态库Ӟ入口点也是动态库的入口函数?br>    ulTextBase是正文段的基址?br>    ulDataBase是数据段基址?br>    其实在这些成员中Q只要注意usMagic和ulEntry可以了?br>

    D落?/strong>
    D落头紧跟在可选头的后面(如果可选头的长度ؓ0Q那么它是紧跟在文件头后)。它的长度ؓ36个字节,如下Q?br>typedef struct {
  char           cName[8];  // D名
  unsigned long  ulVSize;  // 虚拟大小
  unsigned long  ulVAddr;  // 虚拟地址
  unsigned long  ulSize;  // D长?br>  unsigned long  ulSecOffset;  // D|据偏U?br>  unsigned long  ulRelOffset;  // D重定位表偏U?br>  unsigned long  ulLNOffset;  // 行号表偏U?br>  unsigned short ulNumRel;  // 重定位表长度
  unsigned short ulNumLN;  // 行号表长?br>  unsigned long  ulFlags;  // D|?br>} SECHDR;
    q个头可是个重要的头_我们要用到的最l信息就由它来描q。一个COFF文g可以不要其它的节Q但文g头和D落头这两节是必不可的?br>    cName用来保存D名Q常用的D名?textQ?dataQ?commentQ?bss{?textD|正文D,通常也就是代码段Q?data是数据段Q在q个数据D中所保存的数据是初始化过的数据;.bssD也可以用来保存数据Q不q这里的数据是未初始化的Q这个段也是一个空D;.commentD,看名字也知道Q它是注释段Q用来保存一些编译信息,是对COFF文g的注释?br>    ulVSize是段数据载入内存时的大小。只在可执行文g中有效,在目标文件中Mؓ0。如果它的长度大于段的实际长度,则多的部分将?来填充?br>    ulVAddr是段数据载入或连接时的虚拟地址。对于可执行文g来说Q这个地址是相对于它的地址I间而言。当可执行文件被载入内存Ӟq个地址是D中数据的第一个字节的位置。而对于目标文件而言Q这只是重定位时Q段数据当前位置的一个偏U量。ؓ了计方便,便定位的计算化,它通常设ؓ0?br>    ulSizeq才是段中数据的实际长度Q也是D|据的长度Q在dD|据时q它来定要读多少字节?br>    ulSecOffset是段数据在COFF文g中的偏移量?br>    ulRelOffset是该D늚重定位信息的偏移量。它指向了重定位表的一个记录?br>    ulLNOffset是该D늚行号表的偏移量。它指向的是行号表中的一个记录?br>    ulNumRel是重定位信息的记录数。从ulRelOffset指向的记录开始,到第ulNumRel个记录ؓ止,都是该段的重定位信息?br>    ulNumLN和ulNumRel怼。不q它是行号信息的记录数?br>    ulFlags是该D늚属性标识。其值如下表Q?br>
?/td> 名称 说明
0x0020 STYP_TEXT 正文D|识,说明该段是代码?/td>
0x0040 STYP_DATA 数据D|识,有些标识的段用来保存已初始化数据?/td>
0x0080 STYP_BSS 有这个标识段也是用来保存数据Q不q这里的数据是未初始化数据?/span>
    注意Q在BSSD中QulVSize、ulVAddr、ulSize、ulSecOffset、ulRelOffset、ulLNOffset、ulNumRel、ulNumLN的值都?。(上表只是部分|其它值在PE格式中介l,后同Q?br>

    D|?/strong>
    “?#8221;如其名,q里是保存各个段的数据的位置。不同类型的D,数据的内宏V结构也不尽相同。但在目标文件中Q这些数据都是原始数据(Raw DataQ。不存在什么特别的格式?br>
    重定位表
    q个表所保存的是各个D늚重定位信息。这是一张很大的表,因ؓ所有段的重定位信息都在q个表里。各个段落头记录了自q重定位信息的偏移和数量。要用到重定位信息时到q个表里来读。当Ӟ你也可以把整个重定位表看成多个重定位表,每个D落都有一个自q重定位表。这个表只在目标文g中有Q可执行文g中是不存在这个表的?br>    既然有表Q那么就会有记录。重定位表中的每一条记录就是一条重定位信息。这个记录的l构很简单,如下Q?br>typedef struct {
  unsigned long  ulAddr;  // 定位偏移
  unsigned long  ulSymbol;  // W号
  unsigned short usType;  // 定位cd
} RELOC;
    有够单吧Q一共只三个成员QulAddr是要定位的内容在D内偏移。比如:一个正文段Qv始位|ؓ0x010QulAddr的gؓ0x05Q那你的定位信息p写在0x15处。而且信息的长度要看你的代码的cdQ?2位的代码要写4个字节,16位的只要字2个字节?br>    ulSymbol是符L引,它指向符可中的一个记录。注意,q里是烦引,不是偏移Q它只是W号表中的一个记录的记录受这个成员指明了重定位信息所Ҏ的符受?br>usType是重定位cd的标识?2位代码中Q通常只用两种定位方式。一是绝对定位,二是相对定位。其代码如下Q?br>
?/td> 名称 说明
6 RELOC_ADDR32 32位绝对定位?/td>
20 RELOC_REL32 32位相对定位?/td>
    对于不同的处理器Q这些g不尽相同。这里给出的是i386q_上最常用的两个种定位方式的标识?br>    其定位方式如下:
    l对定位
    在绝对定位方式下Q你要给出符Ll对地址Q注意,有时候这里可能不是地址Q而是|对于帔R来说Q你不用l出它的地|只用l出它的|。当Ӟq个地址也不是现成的Q你要用W号的相对地址Q它所在段的相对地址来得到它的绝对地址?br>    公式Q符L对地址Q段偏移Q符号偏U?/strong>
    q些偏移量你要分别从D落头和W号表中得到。当D落要重定位Ӟ当然q要先重定位D落Q才能定位其中的W号?br>    相对定位
    相对定位要复杂一些。它所要的地址信息是相对于当前位置的偏U,q个当前位置是ulAddr所指向的这个偏Uȝl对地址后四个字节(32位代码是四个字节Q?6位是两个字节Q的位置。也是用定位偏U+当前D偏U+机器字长÷8
    公式Q当前地址Q定位偏U+当前D偏U+机器字长÷8
    有了当前地址Q相对地址好计算了。只要用W号的绝对地址减去当前地址可以了?br>    公式Q相对地址Q符L对地址-当前地址
    计算好了地址Q把它写到ulAddr所指向的位|,׃切OKQ你已经完成了重定位的工作了?br>
    行号?/strong>
    行号表在调试时很有用。它把可执行的二q制代码与源代码的行号之间徏立了Ҏ关系。这P当程序执行不正确Ӟ其实正确的也可以JQ,我们可以根据当前执行代码的位置得知出错源代码的行号Q再加以修改。如果没有它的话Q鬼才知道是哪一行出了毛病!
    它的格式也很单。只有两个成员,如下Q?br>typedef struct {
    unsigned long ulAddrORSymbol;  // 代码地址或符L?br>    unsigned short usLineNo;  // 行号
} LINENO;
    让我们先看第二个成员QusLineNo。这是一个从1开始计数的计数器,它代表源代码的行受第一个成员ulAddrORSymbol在行号大?Ӟ代表源代码的地址Q而当行号?Ӟ它就成了行号所Ҏ的符号在W号表中的烦引。下面让我们来看看符可吧!

    W号?/strong>
    W号表是对象文g中用来保存符号信息的一张表Q也是COFF文g中最为复杂的一张表。所有段落用到的符号都在这个表里。它也是由很多条记录l成Q每条记录都以如下结构保存:
typedef struct {
  union {
    char cName[8];            // W号名称
    struct {
      unsigned long ulZero;   // 字符串表标识
      unsigned long ulOffset; // 字符串偏U?br>    } e;
  } e;
  unsigned long ulValue;     // W号?br>  short iSection;            // W号所在段
  unsigned short usType;     // W号cd
  unsigned char usClass;     // W号存储cd
  unsigned char usNumAux;    // W号附加记录?br>} SYMENT;
    cNameW号名称Q和前面所有的名称一P它也?个字节,但不同的是它在一个联合体中。和它占相同的存储空间的q有ulZero和ulOffsetq两个成员。如果符L名称只有8个字W,那很好,可以直接攑ֈq个cName中;可是Q如果名U的长度大于8个字节,q里放不下了,只好攑ֈ字符串表中。这时候,ulZero的值就会ؓ0Q而在ulOffset中会l出我们所用的W号的名U在字符串表中的偏移?br>    一个符h了名UC够,它还要有|ulValue是q个W号所代表的倹{?br>    iSection成员指出了这个符h在的D落。如果它的gؓ0Q那么这个符号就是一个外部符P要从其它的COFF文g中解析(q接多个目标文g是要解析这U符P。当它的gؓ-1Ӟ说明q个W号的值是一个常量,不是它在D落中的偏移。而当它的gؓ-2Ӟq个W号只是一个调试符P只有在调试时才会用到它。当它大?Ӟ才是W号所在段的烦引倹{?br>    usType是符Lcd标识。它用来说明q个W号的类型,是函敎ͼ整型Q还是其它什么。这个标识是两个字节?br>    低字节的低四位是基本标识Q它指出了符L基本cdQ如整型Q字W,l构Q联合等。高四位指出了符L高cdQ如指针Q?001bQ,函数Q?010bQ,数组Q?011bQ,无类型(0000bQ等。现在的~译器,通常不用基本类型,只用高U类型。所以,W号的基本类型通常被设??br>高字节通常未用?br>    usClass是符L存储cd标识。它指明了符L存储方式?br>    其g意义见下表:
?/td> 名称 说明
NULL 0 无存储类型?/td>
AUTOMATIC 1 自动cd。通常是在栈中分配的变量?/td>
EXTERNAL 2 外部W号。当为外部符hQiSection的值应该ؓ0Q如果不?Q则ulValue为符号在D中的偏UR?/td>
STATIC 3 静态类型。ulValue为符号在D中的偏UR如果偏UMؓ0Q那么这个符号代表段名?/td>
REGISTER 4 寄存器变量?/td>
MEMBER_OF_STRUCT 8 l构成员。ulValuegؓ该符号在l构中的序?/td>
STRUCT_TAG 10 l构标识W?/td>
MEMBER_OF_UNION 11 联合成员。ulValuegؓ该符号在联合中的序?/td>
UNION_TAG 12 联合标识W?/td>
TYPE_DEFINITION 13 cd定义?/td>
FUNCTION 101 函数名?/td>
FILE 102 文g名?/td>
    最后一个成员usNumAux是附加记录的数量。附加记录是用来描述W号的一些附加信息,Z便于保存Q这些附加记录通常选择成ؓ一条符号信息记录的整数倍(多数?Q。所以,如果q个成员的gؓ1Q那么就表示在当前符号信息记录后附加了一条记录,用来保存附加信息?br>    附加信息的结构是与符Lcd以及存储cd相关的。不同的cd的符P光加信息(如果有的话)的结构也不同。如果你不在意这些内容,也可以把它们乎略?br>     当段的类型ؓFILEӞ附加信息是一个字W串Q它是目标文件对应源文g的名U。其它类型在介绍PE时再q行详细讨论?br>
    字符串表
    不用多说Q瞎子也能看个表是用来保存字W串的。它紧接在符可后。至于ؓ什么要保存字符Ԍ前面已经说过了。这里就不再多说了,只说说字W串的保存格式?br>     字符串表是所有节中最单一节。如下图Q?/div>
0                             4                        
字符串表长度 字符?\0
.... 字符串n\0

    字符串表的前四个字节是字W串表的长度Q以字节为单位。其后就是以0l尾的字W串QC风格字符Ԍ。要注意的是Q字W串表的长度不仅仅是字符串的长度Q这个长度要包括每个字符串后?#8216;\0’Q的dQ它q包括这个长度域的四个字节。符可中ulOffset成员所指出的偏Ud是从字符串表起始处的偏移。比如:指像每一个字W串的符PulOffset的值Mؓ4?br>    下面l出的代码,是从字符串表中读取字W串的典型C代码?br>
int iStrlen,iCur=4;                 // iStrLen是字W串表的长度QiCur是当前字W串偏移
char *str;                          // 字符串表
read(fn, &iStrlen, 4);              // 得到字符串表长度
str = (char *)malloc(iStrlen);      // 为字W串表分配空?br>while (iCur<iStrlen )               // dW串表,直到全部d内存
    iCur+=read(fn, str+iCur, iStrlen- iCur);
iCur=4;                             // 把当前字W串偏移指到每一个字W串
while (iCur<iStrlen ) {             // 昄每一个字W串
    printf("String offset 0x%04X : %s\n", iCur, str + iCur);
    iCur+=(strlen(str+iCur)+1);     // 计算偏移时不要忘了计?#8216;\0’字符所占的1个字节!
}
free(str);                          // 释放字符串表I间
 
    直到q里Q整个COFF的结构已l全部介l完了。很多了解PE格式的朋友一定会奇怪,好像了很多内容Q?是的Q标准的COFF文g只有q么多的东西。但MSZ和DOS的可执行文g兼容Q以及对可执行文件功能的扩展Q在COFF格式中加了很多它自己的标准。让我差点就认不出COFF了。但了解了COFF文g以后Q再来学习PE文g的格式,那就很简单了?br>    想了解PE文g的格式?|上有很多它的资料,我将在本文的基础上再写几文章,分别介绍PEQOMF以及ELF的格式?br>    现在大家可以自己动手Q写一个COFF文g解析器或是一个简单的q接E序了!


Charles 2007-07-19 16:52 发表评论
]]>微YC/C++ ~译器选项zzhttp://www.shnenglu.com/Winux32/archive/2007/07/17/28227.htmlCharlesCharlesTue, 17 Jul 2007 15:16:00 GMThttp://www.shnenglu.com/Winux32/archive/2007/07/17/28227.htmlhttp://www.shnenglu.com/Winux32/comments/28227.htmlhttp://www.shnenglu.com/Winux32/archive/2007/07/17/28227.html#Feedback0http://www.shnenglu.com/Winux32/comments/commentRss/28227.htmlhttp://www.shnenglu.com/Winux32/services/trackbacks/28227.html-优化-
/O1 最化I间 minimize space
/Op[-] 改善点C致?improve floating-pt consistency
/O2 最大化速度 maximize speed
/Os 优选代码空?favor code space
/Oa 假设没有别名 assume no aliasing
/Ot 优选代码速度 favor code speed
/Ob 内联展开Q默?n=0Q?inline expansion (default n=0)
/Ow 假设交叉函数别名 assume cross-function aliasing
/Od 用优化Q默认| disable optimizations (default)
/Ox 最大化选项?/Ogityb2 /Gs) maximum opts. (/Ogityb1 /Gs)
/Og 启用全局优化 enable global optimization
/Oy[-] 启用框架指针省略 enable frame pointer omission
/Oi 启用内徏函数 enable intrinsic functions
-代码生成-
/G3 ?80386 q行优化 optimize for 80386
/G4 ?80486 q行优化 optimize for 80486
/GR[-] 启用 C++ RTTI enable C++ RTTI
/G5 ?Pentium q行优化 optimize for Pentium
/G6 ?Pentium Pro q行优化 optimize for Pentium Pro
/GX[-] 启用 C++ 异常处理Q与 /EHsc 相同Q?enable C++ EH (same as /EHsc)
/EHs 启用同步 C++ 异常处理 enable synchronous C++ EH
/GD ?Windows DLL q行优化 optimize for Windows DLL
/GB 为؜合模型进行优化(默认Q?optimize for blended model (default)
/EHa 启用异步 C++ 异常处理 enable asynchronous C++ EH
/Gd __cdecl 调用U定 __cdecl calling convention
/EHc extern“C”默认?nothrow extern "C" defaults to nothrow
/Gr __fastcall 调用U定 __fastcall calling convention
/Gi[-] 启用增量~译 enable incremental compilation
/Gz __stdcall 调用U定 __stdcall calling convention
/Gm[-] 启用最重新生?enable minimal rebuild
/GA ?Windows 应用E序q行优化 optimize for Windows Application
/Gf 启用字符串池 enable string pooling
/QIfdiv[-] 启用 Pentium FDIV 修复 enable Pentium FDIV fix
/GF 启用只读字符串池 enable read-only string pooling
/QI0f[-] 启用 Pentium 0x0f 修复 enable Pentium 0x0f fix
/Gy 分隔链接器函?separate functions for linker
/GZ 启用q行时调试检?enable runtime debug checks
/Gh 启用钩子函数调用 enable hook function call
/Ge Ҏ有函数强制堆栈检?force stack checking for all funcs
/Gs[num] 用堆栈查调?disable stack checking calls
-输出文g-
/Fa[file] 命名E序集列表文?name assembly listing file
/Fo 命名对象文g name object file
/FA[sc] 配置E序集列?configure assembly listing
/Fp 命名预编译头文g name precompiled header file
/Fd[file] 命名 .PDB 文g name .PDB file
/Fr[file] 命名源浏览器文g name source browser file
/Fe 命名可执行文?name executable file
/FR[file] 命名扩展 .SBR 文g name extended .SBR file
/Fm[file] 命名映射文g name map file
-预处理器-
/FI 命名强制包含文g name forced include file
/C 不吸取注?don't strip comments
/U U除预定义宏 remove predefined macro
/D{=|#} 定义?define macro
/u U除所有预定义?remove all predefined macros
/E 预处理定向到标准输?preprocess to stdout
/I d到包含文件的搜烦路径 add to include search path
/EP 预处理定向到标准输出,不要带行?preprocess to stdout, no #line
/X 忽略“标准位置” ignore "standard places"
/P 预处理到文g preprocess to file
-语言-
/Zi 启用调试信息 enable debugging information
/Zl 忽略 .OBJ 中的默认库名 omit default library name in .OBJ
/ZI 启用调试信息?#8220;~辑ql?#8221;功能 enable Edit and Continue debug info
/Zg 生成函数原型 generate function prototypes
/Z7 启用旧式调试信息 enable old-style debug info
/Zs 只进行语法检?syntax check only
/Zd 仅要行号调试信息 line number debugging info only
/vd{0|1} 用/启用 vtordisp disable/enable vtordisp
/Zp[n] ?n 字节边界上包装结?pack structs on n-byte boundary
/vm 指向成员的指针类?type of pointers to members
/Za 用扩展Q暗?/OpQ?disable extensions (implies /Op)
/noBool 用“bool”关键?disable "bool" keyword
/Ze 启用扩展Q默认) enable extensions (default)
- 杂项 -
/?, /help 打印此帮助消?print this help message
/c 只编译,不链?compile only, no link
/W 讄警告{Q默?n=1Q?set warning level (default n=1)
/H 最大化外部名称长度 max external name length
/J 默认 char cd?unsigned default char type is unsigned
/nologo 取消昄版权消息 suppress copyright message
/WX 警告视为错?treat warnings as errors
/Tc 文件编译ؓ .c compile file as .c
/Yc[file] 创徏 .PCH 文g create .PCH file
/Tp 文件编译ؓ .cpp compile file as .cpp
/Yd 调试信息放在每?.OBJ ?put debug info in every .OBJ
/TC 所有文件编译ؓ .c compile all files as .c
/TP 所有文件编译ؓ .cpp compile all files as .cpp
/Yu[file] 使用 .PCH 文g use .PCH file
/V 讄版本字符?set version string
/YX[file] 自动?.PCH 文g automatic .PCH
/w 用所有警?disable all warnings
/Zm 最大内存分配(默认?%Q?max memory alloc (% of default)
-链接-
/MD ?MSVCRT.LIB 链接 link with MSVCRT.LIB
/MDd ?MSVCRTD.LIB 调试库链?link with MSVCRTD.LIB debug lib
/ML ?LIBC.LIB 链接 link with LIBC.LIB
/MLd ?LIBCD.LIB 调试库链?link with LIBCD.LIB debug lib
/MT ?LIBCMT.LIB 链接 link with LIBCMT.LIB
/MTd ?LIBCMTD.LIB 调试库链?link with LIBCMTD.LIB debug lib
/LD 创徏 .DLL Create .DLL
/F 讄堆栈大小 set stack size
/LDd 创徏 .DLL 调试?Create .DLL debug libary
/link [链接器选项和库] [linker options and libraries]

Charles 2007-07-17 23:16 发表评论
]]>
Linux中的~写zzhttp://www.shnenglu.com/Winux32/archive/2007/03/24/20484.htmlCharlesCharlesFri, 23 Mar 2007 16:58:00 GMThttp://www.shnenglu.com/Winux32/archive/2007/03/24/20484.htmlhttp://www.shnenglu.com/Winux32/comments/20484.htmlhttp://www.shnenglu.com/Winux32/archive/2007/03/24/20484.html#Feedback0http://www.shnenglu.com/Winux32/comments/commentRss/20484.htmlhttp://www.shnenglu.com/Winux32/services/trackbacks/20484.html   
    RC  
   
    在Linux中,最为常用的~略语也许是“rc”,它是“runcomm”的~写――即名词“run   command?q行命o)的简写。今天,“rc”是M脚本cL件的后缀Q这些脚本通常在程序的启动阶段被调用,通常是Linuxpȝ启动时。如   /etc/rs是Linux启动的主脚本Q?bashrc是当Linux的bash   shell启动后所q行的脚本?bashrc的前~?”是一个命名标准,它被设计用来在用h件中隐藏那些用户指定的特D文?“ls”命令默认情况下不会列出此类文gQ“rm”默认情况下也不会删除它们。许多程序在启动Ӟ都需要“rc”后~的初始文件或配置文gQ这对于Unix的文件系l视图来_没有什么神U的? 
   
    ETC  
   
    在“etc/bin”中的“etc”真正代表的是“etcetera?附加?。在早期的Unixpȝ中,最为重要的目录是“bin”目?  (“bin”是“binaries”二q制文g――编译后的程序的~写)Q“etc”中则包含琐的E序Q如启动、关机和理。运行一个Linux必须的东西的列表?一个二q制E序QetceteraQetcetera――换句话_是一个底层的重要目Q通常d一些次{重要的零碎事物。今天,   “etc”包含了q泛的系l配|文Ӟq些配置文g几乎包含了系l配|的Ҏ面面Q同样非帔R要? 
   
    Bin  
   
    今天Q许多在Linux上运行的大型子系l,如GNOME或OracleQ所~译成的E序使用它们自己的“bin”目?或者是   /usr/binQ或者是/usr/local/bin)作ؓ标准的存攑֜。同P现在也能够在q些目录看到脚本文gQ因为“bin”目录通常d到用LPATH路径中,q样他们才能够正常的使用E序。因此运行脚本通常在bin中运行良好? 
   
    TTY  
   
    在Linux中,TTY也许是跟l端有关pȝ最为؜q术语。TTY是TeleTYpe的一个老羃写。TeletypesQ或?  teletypewritersQ原来指的是电传打字机,是通过串行U用打印机键盘通过阅读和发送信息的东西Q和古老的甉|机区别ƈ不是很大。之后,当计机只能以批处理方式q行?当时I孔卡片阅读器是唯一一UɽE序载入q行的方?Q电传打字机成ؓ唯一能够被用的“实时”输?输出讑֤。最l,电传打字键盘和显C器l端所取代Q但在终端或   TTY接插的地方,操作pȝ仍然需要一个程序来监视串行端口。一个getty“Get   TTY”的处理q程?一个程序监视物理的TTY/l端接口。对一个虚拟网l沮丧服务器(VNC)来说Q一个伪装的TTY(Pseudo-TTYQ即家猫的TTYQ也叫做“PTY?是等Ll端。当你运行一个xterm(l端仿真E序)或GNOMEl端E序ӞPTY对虚拟的用户或者如xterm一L伪终端来_像是一个TTY在运行。“Pseudo”的意思是“duplicating   in   a   fake   way?用伪造的Ҏ复制)Q它相比“virtual”或“emulated”更能真实的说明问题。而在现在的计中Q它却处于被攑ּ的阶Dc? 
   
    Dev  
   
    从TTY留下的命令有“stty”,是“set   tty?讄TTY)的羃写,它能够生成一个配|文?etc/initab(“initialization   table”,初始?Q以配置gettys使用哪一个串口。在CQ直接附加在LinuxH口上的唯一l端通常是控制台Q由于它是特D的TTYQ因此被命名为“console”。当Ӟ一旦你启动X11Q“console”TTY׃消失Q再也不能用串口协议。所有的TTY都被储存在?dev”目录,它是“[physical]   devices?[物理]讑֤)的羃写。以前,你必d电脑后面的串口中接入一个新的终端时Q手工修改和配置每一个设备文件。现在,Linux(?  Unix)在安装过E中在此目录中创徏了它所能向导的每一个设备的文g。这是_你很需要自己创建它? 
   
    随着g在电脑中的移出移q,q些名字变得更加模p不清。幸q的是,今天在Linux上的高等UY件块对历史和g使用Ҏ理解的名字。D例来_嗯,Pango(http://www.pango.org/)是其中之一? 
   
    如果你对q些内容很感兴趣Q那么我你阅d大的Q但有些以美国英语历史ؓ中心的,由Eric   S.   Raymond撰写的Jargon   File。它q没有解释所有在Unix中用的术语Q但是它l出了这些Ş成的大致情况?img src ="http://www.shnenglu.com/Winux32/aggbug/20484.html" width = "1" height = "1" />

Charles 2007-03-24 00:58 发表评论
]]>
C++各大有名库的介绍z http://www.shnenglu.com/Winux32/archive/2007/03/13/19771.htmlCharlesCharlesTue, 13 Mar 2007 12:51:00 GMThttp://www.shnenglu.com/Winux32/archive/2007/03/13/19771.htmlhttp://www.shnenglu.com/Winux32/comments/19771.htmlhttp://www.shnenglu.com/Winux32/archive/2007/03/13/19771.html#Feedback0http://www.shnenglu.com/Winux32/comments/commentRss/19771.htmlhttp://www.shnenglu.com/Winux32/services/trackbacks/19771.html各大有名库的介绍

转蝲自:www.csdn.net

在C++中,库的C是非帔R的。C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过设计更多的语法的a论。现实中QC++的库门类J多Q解决的问题也是极其q泛Q库从轻量到重量的都有。不都是让人眼界大开Q亦或是望而生叹的思维C。由于库的数量非常庞大,而且限于W者水qI其中很多q不了解。所以文中所提的一些库都是比较著名的大型库?/p>

标准?/p>

标准库中提供了C++E序的基本设施。虽然C++标准库随着C++标准折腾了许多年Q直到标准的出台才正式定型,但是在标准库的实C却很令hƣ慰得看到多U实玎ͼq且已被实践证明为有工业U别强度的佳作?/p>

1、 ?Dinkumware C++ Library

参考站点:

P.J. Plauger~写的高品质的标准库。P.J. Plauger博士是Dr. Dobb'sE序设计杰出奖的获得者。其~写的库长期被Microsoft采用Qƈ且最qBorland也取得了其OEM的licenseQ在其C/C++的品中采用Dinkumware的库?/p>

2、 ?RogueWave Standard C++ Library

参考站点:

q个库在Borland C++ Builder的早期版本中曄被采用,后来被其他的库给替换了。笔者不推荐使用?/p>

3、SGI STL

参考站点:

SGI公司的C++标准模版库?/p>

4、STLport

参考站点:

SGI STL库的跨^台可UL版本?/p>

 

准标准库——Boost

Boost库是一个经q千锤百点{可UL、提供源代码的C++库,作ؓ标准库的后备Q是C++标准化进E的发动Z一?Boost库由C++标准委员会库工作l成员发P在C++C֌中媄响甚大,其成员已q?000人?Boost库ؓ我们带来了最新、最酗最实用的技术,是不折不扣的“准”标准库?/p>

Boost中比较有名气的有q么几个库:

Regex
正则表达式库

Spirit
LL parser frameworkQ用C++代码直接表达EBNF

Graph
囄件和法

Lambda
在调用的地方定义短小匿名的函数对象,很实用的functional功能

concept check
查泛型编E中的concept

Mpl
用模板实现的元编E框?/p>

Thread
可移植的C++多线E库

Python
把C++cd函数映射到Python之中

Pool
内存池管?/p>

smart_ptr
5个智能指针,学习指针必读Q一份不错的参考是来自CUJ的文章:
Smart Pointers in Boost,哦,q篇文章可以查到QCUJ是提供在U浏览的。中文版见笔者在《Dr.Dobb's Journal软g研发杂志》第7辑上的译文?/p>

BoostM来说是实用h值很高,质量很高的库。ƈ且由于其对跨q_的强调,Ҏ准C++的强调,是编写^台无养ICC++的开发者必备的工具。但是Boost中也有很多是实验性质的东西,在实际的开发中实用需要}慎。ƈ且很多Boost中的库功能堪U对语言功能的扩展,其构造用精巧的手法Q不要N然的p旉研读。Boost另外一面,比如Graphq样的库则是h工业强度Q结构良好,非常值得研读的精品代码,q且也可以放心的在品代码中多多利用?/p>

参考站点:Q国内镜像:

Q?/p>

GUI

在众多C++的库中,GUI部分的库是比较J荣Q也比较引h注目的。在实际开发中QGUI库的选择也是非常重要的一件事情,下面我们lD一下可选择的GUI库,各自的特点以及相兛_L支持?/p>

1、 ?MFC

大名鼎鼎的微软基cdQMicrosoft Foundation ClassQ。大凡学qVC++的h都应该知道这个库。虽然从技术角度讲QMFC是不大漂亮的Q但是它构徏于Windows API 之上Q能够ɽE序员的工作更容?~程效率高,减少了大量在建立 Windows E序时必ȝ写的代码Q同时它q提供了所有一?C++ ~程的优点,例如l承和封装。MFC ~写的程序在各个版本的Windows操作pȝ上是可移植的Q例如,在Windows 3.1下编写的代码可以很容易地UL?Windows NT ?Windows 95 上。但是在最q发展以及官Ҏ持上日渐势微?/p>

2、 ?QT

参考网站:

Qt是Trolltech公司的一个多q_的C++囑Ş用户界面应用E序框架。它提供l应用程序开发者徏立艺术的图形用L面所需的所用功能。Qt是完全面向对象的很容易扩展,q且允许真正地组件编E。自?996q早些时候,Qtq入商业领域Q它已经成ؓ全世界范围内数千U成功的应用E序的基。Qt也是行的Linux桌面环境KDE 的基Q同时它q支持Windows、Macintosh、Unix/X11{多U^台?/p>

3、WxWindows

参考网站:

跨^台的GUI库。因为其cdơ极像MFCQ所以有文章介绍从MFC到WxWindows的代码移植以实现跨^台的功能。通过多年的开发也是一个日完善的GUI库,支持同样不弱于前面两个库。ƈ且是完全开放源代码的。新q的C++ Builder X的GUI设计器就是基于这个库的?/p>

4、Fox

开放源代码的GUI库。作者从自己亲n的开发经验中得出了一个理想的GUI库应该是什么样子的感受出发Q从而开始了对这个库的开发。有兴趣的可以尝试一下?/p>

参考网站:

5、 ?WTL

ZATL的一个库。因Z用了大量ATL的轻量手法Q模板等技术,在代码尺寸,以及速度优化斚w做得非常C。主要面向的使用体是开发COM轻量U供|络下蝲的可视化控g的开发者?/p>

6、 ?GTK

参考网站:http://gtkmm.sourceforge.net/

GTK是一个大名鼎鼎的C的开源GUI库。在Linux世界中有Gnomeq样的杀手应用。而GTK是q个库的C++装版本?/p>


|络通信

ACE

参考网站:

C++库的代表Q超重量U的|络通信开发框架。ACE自适配通信环境QAdaptive Communication EnvironmentQ是可以自由使用、开放源代码的面向对象框Ӟ在其中实C许多用于q发通信软g的核心模式。ACE提供了一l丰富的可复用C++包装外观QWrapper FacadeQ和框架lgQ可跨越多种q_完成通用的通信软gdQ其中包括:事g多\分离和事件处理器分派、信号处理、服务初始化、进E间通信、共享内存管理、消息\由、分布式服务动态(重)配置、ƈ发执行和同步Q等{?/p>

StreamModule

参考网站:

设计用于化编写分布式E序的库。尝试着使得~写处理异步行ؓ的程序更ҎQ而不是用同步的外壛_起异步的本质?/p>

SimpleSocket

参考网站:http://home.hetnet.nl/~lcbokkers/simsock.htm

q个cd让编写基于socket的客?服务器程序更加容易?/p>

A Stream Socket API for C++

参考网站:

又一个对Socket的封装库?/p>

XML

Xerces

参考网站:http://xml.apache.org/xerces-c/

Xerces-C++ 是一个非常健壮的XML解析器,它提供了验证Q以及SAX和DOM API。XML验证在文档类型定?Document Type DefinitionQDTD)斚w有很好的支持Qƈ且在2001q?2月增加了支持W3C XML Schema 的基本完整的开放标准?/p>

XMLBooster

参考网站:

q个库通过产生特制的parser的办法极大的提高了XML解析的速度Qƈ且能够生相应的GUIE序来修改这个parser。在DOM和SAX两大LXML解析办法之外提供了另外一个可行的解决Ҏ?/p>

Pull Parser

         参考网站:

         q个库采用pullҎ的parser。在每个SAX的parser底层都有一个pull的parserQ这个xpp把这层暴露出来直接给大家使用。在要充分考虑速度的时候值得试?/p>

Xalan

         参考网站:http://xml.apache.org/xalan-c/

         Xalan是一个用于把XML文档转换为HTMLQ纯文本或者其他XMLcd文档的XSLT处理器?/p>

CMarkup

         参考网站:

         q是一U用EDOM的XML解析器。在很多思\上面非常灉|实用。值得大家在DOM和SAX之外L一点灵感?/p>

libxml++

http://libxmlplusplus.sourceforge.net/

libxml++是对著名的libxml XML解析器的C++装版本

 

U学计算

Blitz++

参考网站:

Blitz++ 是一个高效率的数D函数库Q它的设计目的是希望建立一套既具像C++ 一h便,同时又比Fortran速度更快的数D环境。通常Q用C++所写出的数值程序,?Fortran?0%左右Q因此Blitz++正是要改掉这个缺炏V方法是利用C++的template技术,E序执行甚至可以比Fortran更快。Blitz++目前仍在发展中,对于常见的SVDQFFTsQQMRES{常见的U性代数方法ƈ不提供,不过使用者可以很Ҏ地利用Blitz++所提供的函数来构徏?/p>

POOMA

参考网站:

POOMA是一个免费的高性能的C++库,用于处理q行式科学计。POOMA的面向对象设计方便了快速的E序开发,对ƈ行机器进行了优化以达到最高的效率Q方便在工业和研I环境中使用?/p>

MTL

参考网站:

Matrix Template Library(MTL)是一个高性能的泛型组件库Q提供了各种格式矩阵的大量线性代数方面的功能。在某些应用使用高性能~译器的情况下,比如Intel的编译器Q从产生的汇~代码可以看出其与手写几乎没有两L效能?/p>

CGAL

参考网站:www.cgal.org

Computational Geometry Algorithms Library的目的是把在计算几何斚w的大部分重要的解x案和Ҏ以C++库的形式提供l工业和学术界的用户?/p>

 

游戏开?/p>

Audio/Video 3D C++ Programming Library

参考网站:

AV3D是一个跨q_Q高性能的C++库。主要的Ҏ是提供3D囑ŞQ声效支持(SB,以及S3MQ,控制接口Q键盘,鼠标和遥感)QXMS?/p>

KlayGE

参考网站:http://home.g365.net/enginedev/

国内游戏开发高手自qC++开发的游戏引擎。KlayGE是一个开放源代码、跨q_的游戏引擎,q用Python作脚本语a。KlayGE在LGPL协议下发行。感谢龚敏敏先生Z国游戏开发事业所做出的A献?/p>

OGRE

参考网站:

OGREQ面向对象的囑Ş渲染引擎Q是用C++开发的Q用灵zȝ面向对象3D引擎。它的目的是让开发者能更方便和直接地开发基?Dg讑֤的应用程序或游戏。引擎中的类库对更底层的pȝ库(如:Direct3D和OpenGLQ的全部使用l节q行了抽象,q提供了Z现实世界对象的接口和其它cR?/p>

 

U程

C++ Threads

参考网站:http://threads.sourceforge.net/

q个库的目标是给E序员提供易于用的c,q些c被l承以提供在Linux环境中很隄到的大量的线E方面的功能?/p>

ZThreads

参考网站:http://zthread.sourceforge.net/

一个先q的面向对象Q跨q_的C++U程和同步库?br /> 

序列?/p>

s11n

参考网站:http://s11n.net/

一个基于STL的C++库,用于序列化PODQSTL容器以及用户定义的类型?/p>

Simple XML Persistence Library

参考网站:http://sxp.sourceforge.net/

q是一个把对象序列化ؓXML的轻量的C++库?/p>

 

字符?/p>

C++ Str Library

参考网站:

操作字符串和字符的库Q支持Windows和支持gcc的多U^台。提供高度优化的代码Qƈ且支持多U程环境和UnicodeQ同时还有正则表辑ּ的支持?/p>

Common Text Transformation Library

参考网站:http://cttl.sourceforge.net/

q是一个解析和修改STL字符串的库。CTTL substringcd以用来比较,插入Q替换以及用EBNF的语法进行解析?/p>

GRETA

参考网站:http://research.microsoft.com/projects/greta/

q是由微软研I的研Ih员开发的处理正则表达式的库。在型匚w的情况下有非怼U的表现?/p>

l合

P::Classes

参考网站:http://pclasses.com/

一个高度可UL的C++应用E序框架。当前关注类型和U程安全的signal/slot机制Qi/opȝ包括Z

插g的网l协议透明的i/o架构Q基于插件的应用E序消息日志框架Q访问sql数据库的cȝ{?/p>

ACDK - Artefaktur Component Development Kit



Charles 2007-03-13 20:51 发表评论
]]>
图说历史 Q?00q来的计机~年Ԍhttp://www.shnenglu.com/Winux32/archive/2007/03/11/19577.htmlCharlesCharlesSun, 11 Mar 2007 11:24:00 GMThttp://www.shnenglu.com/Winux32/archive/2007/03/11/19577.htmlhttp://www.shnenglu.com/Winux32/comments/19577.htmlhttp://www.shnenglu.com/Winux32/archive/2007/03/11/19577.html#Feedback0http://www.shnenglu.com/Winux32/comments/commentRss/19577.htmlhttp://www.shnenglu.com/Winux32/services/trackbacks/19577.html阅读全文

Charles 2007-03-11 19:24 发表评论
]]>
How to "Build" a Computer 11-What's a Register File?http://www.shnenglu.com/Winux32/archive/2007/01/24/17947.htmlCharlesCharlesWed, 24 Jan 2007 01:25:00 GMThttp://www.shnenglu.com/Winux32/archive/2007/01/24/17947.htmlhttp://www.shnenglu.com/Winux32/comments/17947.htmlhttp://www.shnenglu.com/Winux32/archive/2007/01/24/17947.html#Feedback0http://www.shnenglu.com/Winux32/comments/commentRss/17947.htmlhttp://www.shnenglu.com/Winux32/services/trackbacks/17947.html

Register File, Part 1

Consider a typical R-type instruction.
   add $r10, $r3, $r4   # R[10] = R[3] + R[4]
The first step to executing this instruction is fetching the operands. In this case, we need to get the values of $r3 and $r4.

Recall that the CPU processes a 32-bit machine code instruction that's translated from the assembly code above, and encoded in that instruction are the 3 registers. In particular, each of the register is encoded using 5 bit UB.

For example, register 3 is encoded as 00011 and register 4 is encoded as 00100.

We're going to create a circuit called a register file. This circuit contains all 32 user-visible integer registers. We could create one for floating point, but that's not absolutely necessary. You'll still understand how a CPU works if we leave out floating point registers (they work pretty much like the integer registers).

We want the ability to access both registers (in this case, $r3 and $r4) at the same time. That way, we can save time. If we have to access one register at a time, it would slow down the execution of the instruction.

So, we have two sets of inputs to our register file, which specify which two registers we want. They can even be the same register.

Here's how our initial register file looks:

We've labelled the inputs as SRC 1 Index and SRC 2 Index, which are 5 bits each. We can think of registers 3 and 4 and source registers, and their result is stored in the destination register (in our example, it's $r10).

Register File, Part 2

However, we need the register file to have outputs. These outputs are going to be 32 bits each since each register in MIPS32 has 32 bits. The outputs are the contents of the registers specified by SRC 1 Index and SRC 2 Index. Thus SRC 1 Data is the contents of the register specified by SRC 1 Index, and SRC 2 Data is the contents of the register specified by SRC 2 Index.

Register File, Part 3

At this point, the two 32-bit outputs are sent to the ALU (we'll discuss the ALU in more detail soon). The ALU does computations on these and produces a 32-bit result. This result is saved back into the destination register. The register file needs 32-bit data as input as a 5-bit index. We'll call these DST Index and DST Data for short.

The DST Index comes from the instruction itself, just as SRC 1 Index and SRC 2 Index did. In our example, that's the encoding of $r10 (which is 01010).

It turns out we need one more input, in addition to DST Index and DST Data. Even though this particular instruction updates a destination register, not every instruction does so. We want to control when a register value is updated in the register file.

This control signal is called RegWrite and it's only 1 bit. If RegWrite = 1, then a write is performed on the register specified by DST Index, using the 32-bit data given by DST Data. If RegWrite = 0, then no write is performed. Both DST Index and DST Data are ignored.

Which reminds me, we have to talk about a clock. The register file also has a clock. The diagram below is now complete.

Why no RegRead?

You may wonder why there's no RegRead to control when the register file outputs SRC 1 Data and SRC 2 Data.

The reason is simple. SRC 1 Data and SRC 2 Data are sent to the outside world (i.e., to other parts of the CPU). Those parts can simply choose to ignore the data, if they don't need it.

However, when you are performing a write on a register using DST Index and DST Data, you are updating the register file. The register file can't very well ignore that. To give it the option to ignore it, we must include RegWrite.

Clocks

The register file should be thought of as partly using the clock and partly not.

SRC 1 Data and SRC 2 Data are output with a small delay given a change in SRC 1 Index and SRC 2 Index. If you're curious about the implementation (or, more precisely, if you're curious about an implementation), look at the MAR from the previous set of notes.

You can see that it's hooked up to tri-state buffers. Once the tri-state buffers are enabled (which doesn't require a clock), the output is sent to the address bus.

Similarly, SRC 1 Index and SRC 2 Index enable two 32-bit tri-state buffers. In particular, they enable the tri-state buffers to the registers specified by SRC 1 Index and SRC 2 Index.

Again, this part does not need a clock. If SRC 1 Index and SRC 2 Index both change, then the tri-state buffers associated with the new registers are enabled (while the previous ones are disabled), and they are output after a small delay.

Writing Requires a Clock

However, when you want to write to a register, you are performing a parallel load on that register. This operation relies on a clock. We're going to assume that the register file, like MAR and MDR, is loaded on negative edges. This allows computations to be performed by the rest of the CPU before registers are loaded.

Summary

A register file is a black box that contains 32 32-bit registers. At any one time, you can specify up to two registers to "read" and one register to write, with the option to decide whether you want to write or not.

Reading a value from the register file does not require a clock. Once you specify the registers you want to read (i.e., SRC 1 Index and SRC 2 Index), then there's only a small delay before the data comes out of the register file via SRC 1 Data and SRC 2 Data.

Writing a value to the register file does require a clock. You can specify which register you want to write to (using DST Index), the data you want to write (using DST Data) and whether you really want to write to the register file or not (using RegWrite). This action takes place on the negative edge of the clocks. (Positive edges are used to transition in the finite state machine and set up control signals for ALU, MUX, tri-state buffers, etc).



Charles 2007-01-24 09:25 发表评论
]]>
Virtual Bookshelf: What's on Your Shelf?http://www.shnenglu.com/Winux32/archive/2007/01/23/17932.htmlCharlesCharlesTue, 23 Jan 2007 11:09:00 GMThttp://www.shnenglu.com/Winux32/archive/2007/01/23/17932.htmlhttp://www.shnenglu.com/Winux32/comments/17932.htmlhttp://www.shnenglu.com/Winux32/archive/2007/01/23/17932.html#Feedback0http://www.shnenglu.com/Winux32/comments/commentRss/17932.htmlhttp://www.shnenglu.com/Winux32/services/trackbacks/17932.html

  • The C++ Programming Language, Special 3rd Edition by Bjarne Stroustrup.

    Bjarne Stroustrup invented the original C++. Many people refer to the book, and though it certainly has its detractors. The book is not aimed for beginning programmers. Instead, it serves as a reference book to C++. You won't find data structures, nor software engineering in this book.

    Still, most people who program in C++ own this book.

  • C++ Primer by Stanley Lippman, Josee Lajoie

    For those who don't like Stroustrup, and even those who do, another very good reference book in C++.

  • Effective C++: 50 Specific Ways to Improve Your Programs and Design by Scott Meyers

    Advice on how to improve you C++. What's nice about it is that it's a thin book, and you should be able to read it without taking too much time. Meyers has also written two follow-ups: More Effective C++ and Effective STL.

  • Design Patterns by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides.

    The authors are called the GoF (Gang of Four). This is supposedly the book on design patterns. Consider it a collection of ways to organize classes to deal with certain kinds of problems. The main gripe I have about the book is the application domain is a bit large (they talk about how to design a word processor). I would have preferred smaller examples, written in C++ and Java (it's mostly in C++). There are other books on Design Patterns, but none of them seem all that good, except for the following.

  • Effective Java Programming Language Guide by Joshua Bloch

    This book is written like Effective C++. It is a series of tips on writing good Java code. However, it also has advice on design patterns (not a whole lot). You can probably carry over some advice to C++, while you're at it.

  • C Programming: A Modern Approach by K. N. King

    This is the 106 textbook. While I have quibbles with this book for its pedagogy (it doesn't talk about tracing code, its treatment of nested loops is weak, it introduces arrays too late), it's a very good C reference book. King really knows his stuff, and he states things concisely. A great book if you want to brush up on your C.

  • Introduction to Algorithms: Second Edition by Thomas Cormen, Charles Leiserson, Ronald Rivest, and Clifford Stein.

    Before this book, perhaps the classic algorithm book was by Aho, Hopcroft, and Ullman. That algorithms book was pretty dense, written as if it were a math book for math majors.

    This book gave meaning to the "instant classic". Instant classics occur when someone writes a decent book so thick, no one else would actually write such a book again (although this hasn't prevented other authors from trying).

    The proofs in the book are sometimes wordy, taking up a few pages when one page will do, but is generally friendlier than most algorithms books. If you would prefer a more story-like approach to algorithms, read Algorithmics: The Spirit of Computing by David Harel. You won't learn how to solve algorithms, but you should gain some appreciation of algorithms, nevertheless.

  • Computer Organization and Design: The Hardware/Software Interface by David Patterson and John Hennessy.

    This book does some things well (MIPS assembly language) and some things poorly (digital logic design). At the very least, it acknowledges its weaknesses. You're probably better off with the original, Computer Architecture: A Quantitative Approach (3rd edition) by Patterson and Hennessy (the author's names are reversed), since it covers more advanced topics.

  • Computer Systems: A Programmer's Perspective by Randal Bryant and David O'Hallaron.

    West Coast hardware guys vs. East Coast hardware guys. Patterson and Hennessy were the founders of the RISC movement from Berkeley and Stanford, respectively. Bryant and O'Hallaron are from CMU in Pittsburgh.

    Like Patterson and Hennessy, this book does less digital logic than similar computer organization books. For some chapters, the writing is excellent. This book also covers some material that would normally be seen in compiler optimization, and talks about ways to make programs fast. Students learn the most if they can also do the labs associated with the book.

    One drawback (IMO) is the use of the IA32 ISA (dubbed "y86" since it's a subset of x86). While x86 dominates the CPU market and MIPS is non-existent, MIPS is easier to understand and is a modern RISC CPU. Still, if you have to learn a CISC ISA, it might as well be x86 based.

  • Modern C++ Design: Generic Programming and Design Patterns Applied by Andrei Alexandrescu

    OK, this isn't for the faint of heart. This kind of book is starting to approach expert level C++, and if you can learn the stuff in here, you're starting to be an ace C++ programmer.

  • Code Complete: A Practical Handbook of Software Construction by Steve McConnell

    Lots of snippets of advice on how to code. Not specific to any language. You should be able to take something from it, no matter what you read.

  • Types and Programming Languages by Benjamin Pierce

    OK, so not everyone should own this book, but if you were ever interested in type theory, this is the book to get. This explains the theory behind type-safe languages such as Java and ML. Of course, it talks about lambda calculus. You do have to like some math (say, math logic) to follow the book, but since most books on type theory are aimed at grad students, this book is the one to get because it should be readable by a reasonably mathematical undergraduate (that is, if you like math and intro algorithms, and 330, you should be able to read this book).



    Charles 2007-01-23 19:09 发表评论
    ]]>
    69SEXþþƷ鶹| Ʒxxxxˮ޹Ʒþһ | þרƷ| ƷƷھþø| ޾ƷƬþ| ɫþþþSWAGƷ| ҹҹþݺ| þþƷһ| 999þþùƷ| Ʒþþþþ| 97þþƷҹһ| Ʒþ777| Ʒþþþþ˳| þĻһ| AƷһþ| ۿþ| һþöۺ| ձþþվ| þۺϹ׾Ʒ| ˳ŷþ| ޾ƷþþþĻ69| ޾Ʒþ| Ļþ| þþ뾫Ʒҹ| Ʒþþþþþþ| þþƷavӰԺ| þֻƷ99| 㽶99þùۺϾƷլ| þþƷˬӰ| Ʒһþ㽶߿| þ99ƷþþþþҰ | þþþAvר| 99þþƷһ| պŷۺϾþ| ƷþþþӰ| һŷƬþ| ŷ߽˾þ| þþƷƷ | 69Ʒþþþ777| þþþƷþþþɫӰ | þþƷž޾Ʒ|