Popular Tags:

ELF文件格式概述(三):静态链接

October 13, 2016 at 8:58 pm

最近忙着搞毕设和玩ED6,所以好像再一次好久没有更新了。本来今天也是应该全心全意搞毕设的,不过开发环境的搭建似乎异常地耗时,所以干脆就先利用这部分时间来继续ELF的篇章了。事实上之前的loader并不需要链接这样高大上的内容,不过从全面了解ELF文件的角度来看,讨论链接相关的问题仍然是相当有必要的。不出意外的话本篇只讨论静态链接的过程。 本文分为如下几个部分: 1. 链接时的符号解析 2. 重定位表 3. 相似段合并 4. 静态库链接 链接时的符号解析 首先我们假设有这样两个文件a.c和b.c,内容如下所示: /* a. c */ extern int shared; int […]

ELF文件格式概述(二):section header table

September 25, 2016 at 8:03 pm

那么继续上一篇的话题,我们开始研究section header table。本篇主要有如下小节: 1. section header table 2. string table 3. symbol table 4. 代码段 5. 数据段 section header table […]

ELF文件格式概述(一):ELF header

September 24, 2016 at 12:30 pm

无锁系列似乎比想象中要难产阿,主要是最近还有很多事要干,这周内尽量将第4篇更新出来吧。 今天打算对ELF文件格式进行一个整理。第一次接触到ELF文件格式是在于渊的《自己动手写操作系统》里,在这本书里ELF文件格式并不做为一个重点讨论的对象,当时对这部分内容确实也做了一些笔记,但是内容还是偏少;第二次接触ELF则是在《程序员的自我修养--链接、装载于库》中,这本书对于ELF文件格式的结构还是有比较详细的介绍的。 之所以要重新整理这部分的内容,是因为,最近有个地方需要用到一个ELF文件格式的loader,所以需要对这个文件格式进行进一步的了解。本文主要还是一些属于偏陈述性的东西,大概可以称为半技术文。早前在某个网站上看到过一篇对ELF介绍得非常深入的文章(那篇文章的作者应该是做偏硬件的),但是现在找不到了。无论如何,本文将对ELF相关的知识进行重新整理,主要参考上面提到的两本书籍。 本文主要由如下几个小节构成: 1. ELF文件概述 2. ELF header ELF文件概述 ELF(Executable and Linkable Format)文件格式是COFF(Common Object File Format, 通用目标文件格式)的一个变种,广泛使用在unix/linux环境下。在这些环境下,它主要用来表示可执行文件、可重定位文件、共享目标文件和核心转储文件。我们重点关注前面两种形式的文件。 按照我们对可执行文件的理解,里面应当包含代码段、数据段,以进行程序的载入,下面我们通过一个示例来看一下ELF文件格式的概貌: // […]

无锁编程(三):实现无锁的队列

September 19, 2016 at 4:20 pm

距离上一篇正篇已经隔了整整三个月了,之前学的知识也全都忘光了,无论如何,今天开始慢慢填坑吧。 上一篇我们实现了一个简单的无锁的栈,并且介绍了无锁编程中经常涉及的一些概念,如CAS原语。今天我们开始实现一个无锁的队列。在传统的编程中,队列的实现并不比栈来得困难,但是在无锁编程中,两者还是有显著的差别。在栈中,我们只需关心栈顶这样一个位置的情况,而在队列中,元素从队列的尾部进入队列,却是从头部出去,这样我们就需要兼顾两端在无锁的情况下线程安全。 事实上,在多线程编程中,队列的使用比栈要多得多,所以实现无锁的队列,才真正意味着无锁技术得到了实际应用。 本篇主要包含以下内容: 1. 入队操作的设计 2. 出队操作的设计 入队操作的设计 我们首先来讨论入队操作的设计。在上一节栈的设计中,我们的入栈操作只需保证栈顶得到及时的更新就可以了,但是在入队操作中,我们要进行两个操作,首先将队尾元素的next指针域指向新的元素,接着需要将tail指针也指向这个新的元素。这样我们就需要进行两次CAS操作,初步的想法如下(我们假设节点的结构和上一节的栈的节点结构一致): void enqueue(const T &val) { Node *node = new Node; […]

翻译习作:无影灯(一)--引子

September 17, 2016 at 2:31 pm

本来应该是一篇关于色彩解谜向游戏Hue的翻译内容的(英语),但是由于进行了误操作导致游戏无法正常运行,正在和某英国不负责的客服进行邮件沟通中,所以Hue系列在游戏修复之后进行。 本次的作品是zzyzx开发的恐怖向解谜游戏无影灯系列,截止目前一共发行了两部,《無影灯》和《無影灯真相編》(两部在IOS上都是無料配信而且制作精良,总的来说第二部比第一部更吓人一些,欢迎品尝),两部的剧情是连着的,所以本系列将从第一部开始直至第二部揭晓真相。由于本身是游戏题材,所以这里仅翻译游戏的剧情向元素,尽量忽略解谜向元素。游戏的主人公在游戏的进行过程中会不断地收集剧情向道具,这些道具互相补充,最终慢慢揭露整个故事的来龙去脉。 那么,故事开始。 大学3年の夏休み、友人が肝試し「1」に行こうと誘ってきた。 大学三年级的暑假,朋友来邀请我去试一下胆。 行き先はH県S町の外れ「2」にある、小さな廃病院。 此行的终点是H县S镇郊外一个废弃的小医院。 友人は僕を車に乗せ、その廃病院についての噂を教えてくれた。 朋友一边开着车,一边开始给我讲关于这座废弃医院的传闻。 病院の名前は「山下医院」。 医院的名字叫做山下医院。 30年以上前、山下という医者が経営していた個人医院だ。 是30多年前,一个叫做山下的医生开的私人医院。 丁寧な診療で評判がよかった山下医師だが、突然看護師2人と入院していた患者3人を殺害し、自身も自殺した。 山下医生原本因为细心周到的诊疗而备受好评,但不知为何突然杀害了医院里的两名护士和当时住院的3个患者,最后自己也自杀了。 なぜ山下医師がそんな凶行に及んだのか、理由は今もわかっていない。 至于为什么山下医生会犯下这样的罪行,至今也没有人知道。 その後病院は閉鎖され今では廃墟となっているのだが、そんな事件があったせいか若者の間で心霊スポット「3」として有名になっているらしい…。 在那之后,医院就被封锁,现在已经变成了一座废墟。不知道是不是因为这里曾经发生了那样的事情的缘故,这个地方作为一个灵异场所而在年轻人之间广为流传。 友人「ついた。ここだ。」 […]

翻译习作:昭和杂货店物语2里的信件(18)(完結)

September 8, 2016 at 10:48 pm

おばあちゃんえ 写给奶奶 えんぴつでお手紙書くのはじめて! 第一次用铅笔写信! ちゃんと読めるかな。 不知道写得你看不看的懂。 おばあちゃん おたんじょう日 奶奶,生日 おめでとう ずっと長生きして「1」ね 快乐, 祝你健康长寿 こんど 東京で 听说这一次,要在 オリンピックやるんだって! 东京举办奥运会了! そのころは わたし中学生かな 那个时候,我已经是个中学生了吧 たのしみだね 好期待啊 いっしょに 見に行こう! […]

翻译习作:昭和杂货店物语2里的信件(17)

September 8, 2016 at 10:10 pm

おじいさんへ 给爷爷 今日ね、あの子が 今天呀,收到了那个孩子 お手紙をくれたんです。 给我的信。 そう、私たちの孫娘ですよ。 对,我们的小孙女。 ”すばる「1」”って言うのよ。 名字阿叫做“珠晴”哦。 だからね、あなたも、 所以阿,你也当上了 もうおじいさんよ。 爷爷了。 そしてね。 还有阿, ”東京タワー”というのができたのよ。 “东京tower”已经建好了。 たわーって何のことかしらって 我还觉着奇怪,tower是个什么 […]

翻译习作:昭和杂货店物语2里的信件(16)

September 8, 2016 at 9:29 pm

お義父様へ 公公 ご報告があります。 有事情向您汇报。 あの子が。太郎がようやく 那个孩子。太郎,终于 戻ってきました。 回来了。 美人で気の利くお嫁さんも一緒です。 漂亮机灵的新娘子也一起回来。 久子さんって言います。 新娘子叫做久子。 これからは心を入れ替えて 他说从今往后要洗心革面, 家族のために働くと言っています。 为了家庭而工作。 なんだか急にいきり立って「1」しまって 突然变得这么有干劲, …張り切り過ぎない「2」か心配です。 有点担心会不会有点过头了。 […]

RPC(一):基于python实现简单的RPC框架(上)

September 7, 2016 at 10:36 pm

似乎又要放着以前无数个坑不填来挖一个新的坑了,不过这次并不打算挖很深的坑。其实挺早就有对现有的RPC框架有一个简单的理解的想法,所以本文的初步想法是模仿tinyRPC来简单模拟一下RPC框架,这也是本篇的主要内容。如果后面有续篇的话,会花些时间看看像gRPC这样的库的实现机制,不过目前暂时也没有这方面的打算,所以目前而言本系列应该仅此一篇。如果一切顺利的话,之前的坑会在回到学校之后慢慢开始填。废话不多说了,先进入正题吧。 本文主要包含以下内容: 1. 客户端的类本地化调用 2. 序列化协议的设计 3. 通信协议的设计 客户端的类本地化调用 RPC框架中最基本的两个要素是客户端和服务器端,客户端是远程过程的调用者,而服务器端则是过程的实现者,所谓的RPC(Remote Procedure call),就是希望客户端可以像调用本地函数一样调用服务器端的函数。为了做成一个框架,我们需要让客户端可以实现任意函数的调用,由于本文使用python实现,这里利用python的__getattr__(self, name)函数来较为简单、干净地实现这个功能(在python中,如果访问一个类的属性,包括方法不存在时,会调用这个类的__getattr__()来试图返回这个属性或者这个方法的值,对于方法而言,此时可以返回一个函数,这个新的函数将会被调用。这个函数名字有一定的困扰,但在这里使用它可以极大简化代码)。 通过这个函数,我们可以将所有的远程过程调用统一到client的call方法里去: class RPCClient(object): def __getattr__(self, name): func […]

翻译习作:昭和杂货店物语2里的信件(15)

September 5, 2016 at 12:12 pm

父上 父亲大人 戦地より、この手紙を送ります。 现在在战地上,给您寄这封信。 人に見つかれば処分されています。 如果被人发现的话要被处分, 走り書き「1」のような手紙になること、 所以写得很匆忙字迹很潦草, お許し下さい。 请见谅。 このようなこと、 我明知道这样的事情 頼める筋合「2」いではないことを 并不合情合理,但仍希望可以 承知でお頼みします。 拜托您。 家族のこと。家内と太郎のこと、 是指家里的事。妻子和太郎, どうかよろしくお頼みします。 恳请务必照顾好他们。 […]