cppdcc同人图与草坪拼音

2024-04-26 03:39:36
369手游网 > 游戏攻略 > cppdcc同人图与草坪拼音

本文将介绍一些在开发多 Linux 平台 C++ 应用时可能遇到的兼容性问题和相关的解法。虽然是以 C++ 为讲述对象,但兼容性这个问题,在没有 VM 帮你做这些脏活累活的情况下,是所有 C-like 语言(比如 Go、Rust 等)都可能遇到的。

受个人经验所限,本文所讨论内容仅限于 x86 架构下,但相信相关的原理和规则在其他架构下也是相通的,可作借鉴参考。

Linux 二进制兼容

首先,我们来看看什么叫二进制兼容?

众所周知,不同的 Linux 发行版会携带不同的基础库版本,以最常用的 g++ 工具链为例,基于它们的应用会附带地依赖上 libc, libgcc, libstdc++ 等库。显然,当应用使用了高版本才具备的功能后,编译得到的二进制内容在低版本环境中运行时,将产生兼容问题,最常见的表现就是无法运行

简而言之,当所提供的应用 binary 在目标平台上无法正常运行(包括跑不起来这种最差的情况),我们就认为这是一种不兼容的情况。

多平台兼容的常用方法

为了让应用兼容多平台,从开发者的角度一般有以下三个方法 [1]。

1. 为每个目标平台提供特定的 Binary

顾名思义,对于每个目标平台,这种方法都要提供相应的 binary。

这种方法的好处在于每个 binary 或是安装包都能够对目标平台进行针对性适配,在承诺支持的范围内基本不需要担心发生不兼容的情况。

但这种方式的缺点也很明显,维护代价较大。应用每新增一个目标平台,在发布流程中就要为之构建相应的编译打包环境,即便是借助一些手段(比如容器镜像)来实现流程自动化,维护诸多的编译环境本身也会带来不小的工作量。

2. 低版本环境编译

此方法要求开发者将编译环境设置在目标平台中版本最低的环境上,此处的版本主要指的编译工具链。比如我们期望提供 CentOS 5.x 到 7.x 都能运行的应用,那么可以将编译环境设置在 5.0 上。

这个方法源于对 Linux 向后兼容能力的信任,根据经验,在低版本上编译得到的 binary,在高版本上有很大概率能够正常运行。

此方法的缺陷是应用能够使用的功能受限于编译环境,包括所能够使用的语言特性和系统功能。比如:

如果环境上的 gcc 工具链仍在 4.1.x 版本,我们显然无法使用 C++11 等特性。

某些系统库(比如 journal)需要更高的内核版本支持,那么在低版本环境下将无法使用。

3. 静态链接

严格来说,这不算是一个独立解决多平台兼容的方法,因为它完全可以结合前两个方法一并使用,但考虑到这是一个非常常用的办法,在此我们简单地说两句。

此方法解决兼容问题的基本思路是将应用所依赖的各种库都进行静态链接,这样在发布应用时仅需要提供一个单独的 binary,而无需附带上一系列关联的动态库(so 文件),能够有效地降低不兼容问题出现的概率。

但静态链接并非万能,抛开体积膨胀以外,它还有这样两个问题。一方面,有些库的 license 中会限制静态链接,另一方面,即使我们可以对大部分库进行静态链接,但随系统发布的 libc.so [2] 是无法这样做的,它也会带来一些兼容问题 。

我们的多平台兼容思路

本节将简要介绍在开发 Logtail(SLS 采集 agent)的过程中,我们和多平台兼容「斗争」时做出的一些选择。

1. 不排斥高版本编译器(只要稳定)

最初,我们仅采用了方法 2 来做到尽可能地兼容多平台,效果很好。但随着 C++ 标准的不断演进,我们面临了一个直接问题:低版本环境「落后」的语法支持和日益了解的新特性之间的矛盾。在低版本环境下,由于仅支持 C++98,我们:

没法在恰当的地方引入 move 语义,只能依靠注释。

重复地敲打着 auto 就能替换的迭代器类型声明。

...

但经过调研和实践后,我们发现,其实只需要借助静态链接标准库+手动构建编译工具,就能够在保证兼容性地情况下,开心地使用新特性。

2. 尽可能地静态链接(注意版权)

虽然静态链接会导致 binary 产生一定程度的体积膨胀,但相比它能够带来的兼容能力的提升,这些额外的空间开销我们认为是值得的。

对于版权,丰富的开源生态并没有让我们失望,暂未遇到任何这方面的限制。

3. 符号替换

细数我们所遇到的兼容性问题,大多数都是在运行环境中缺失所需符号或是符号版本不一致导致的,此时符号替换将是一个很好的解决思路,事实上,我们也是借此方法来解决 libc.so 带来的一些问题。

操作实践

对于一篇实践类的文章,单纯使用文字来介绍总是匮乏的,也无法清楚地描述实际的问题。因此,本节将通过一个示例来对前述内容进行补充说明。

示例应用代码

在示例应用中,我们使用了 C++11 的一些特性,包括 uniform initialization, lambda (with capture), for auto 等。

#include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; int main() { vector<string> vec = {"b", "a", "d"}; auto printVec = [&vec]() { for (auto &s : vec) { std::cout << s << std::endl; } }; for (int i = 0; i < 10; ++i) { vec.push_back(to_string(i)); } std::cout << "===== Before =====" << std::endl; printVec(); sort(vec.begin(), vec.end()); std::cout << "===== After =====" << std::endl; printVec(); return 0; }

编译及运行环境

如下是示例所使用的两个环境,我们将在 CentOS 7 上使用 g++ 4.8.5 对应用进行编译,然后把得到的 binary 放到 CentOS 5 上运行。

# 在两个环境上分别运行此命令 $ cat /etc/redhat-release; uname -r; g++ --version | grep g++; ld --version | grep ld # 编译环境(高版本) CentOS Linux release 7.5.1804 (Core) 3.10.0-862.3.2.el7.x86_64 g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28) GNU ld version 2.27-27.base.el7 # 运行环境(低版本) CentOS release 5.7 (Final) 2.6.18-274.el5 g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51) GNU ld version 2.17.50.0.6-14.el5 20061020

原始版本(v1)

执行 g++ -o main_v1 -std=c++11 main.cpp 进行编译,将得到的结果拷贝到运行环境执行,结果如下:

./main_v1: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./main_v1)

这个报错表示所链接的 libstdc++.so 无法满足版本要求。对此,分别查看一下 libstdc++.so 和 main_v1 中 GLIBCXX 的版本情况:

$ strings main_v1 | grep "GLIBCXX_" GLIBCXX_3.4.5 GLIBCXX_3.4.14 GLIBCXX_3.4 $ strings /usr/lib64/libstdc++.so.6 | grep "GLIBCXX_" GLIBCXX_3.4 GLIBCXX_3.4.1 ... GLIBCXX_3.4.8 GLIBCXX_FORCE_NEW

可以看到,main_v1 要求 3.4.14 而运行环境上的 libstdc++.so 仅支持到 3.4.8,所以产生了这个错误。

对于这个问题,由于运行环境的不可控,我们无法通过更新 libstdc++.so 来解决,只能通过修改自己的应用来进行兼容。

解决办法:静态链接 libstdc++.a。

此处我们使用 nm 来进一步分析 main_v1 究竟依赖了哪些 3.4.14 版本的符号(配合 c++filt 进行 demangle),结果如下:

$ nm main_v1 | grep "GLIBCXX_3.4.14" U _ZNSsaSEOSs@@GLIBCXX_3.4.14 U _ZNSsC1EOSs@@GLIBCXX_3.4.14 $ c++filt _ZNSsaSEOSs std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&&) $ c++filt _ZNSsC1EOSs std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&&)

可以发现,这是与 string 相关的两个以右值引用为参数的方法,所以在不支持 C++11 的低版本环境上,libstdc++.so 显然不可能有这些符号。

静态链接 libstdc++(v2)

一般来说,编译环境中是不会自带 libstdc++.a,需要做一些额外的安装,比如 CentOS 7 可以直接通过 yum 安装。

如下是做了静态链接后的运行结果:

# 安装 + 静态链接 $ sudo yum install -y libstdc++-static $ g++ -o main_v2 -static-libstdc++ -std=c++11 main.cpp # 运行 ./main_v2: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./main_v2)

和 v1 类似的错误,借助同样的方法可以发现,这次是 libc.so 的版本不支持导致的,main_v2 需要 2.14 而运行环境上仅支持到 2.5。

$ strings main_v2 | grep "GLIBC_" GLIBC_2.3 GLIBC_2.14 GLIBC_2.3.2 GLIBC_2.2.5 $ strings /lib64/libc.so.6 | grep "GLIBC_" GLIBC_2.2.5 GLIBC_2.2.6 GLIBC_2.3 GLIBC_2.3.2 GLIBC_2.3.3 GLIBC_2.3.4 GLIBC_2.4 GLIBC_2.5 GLIBC_PRIVATE

作为一个随系统释出的库,libc.so 带来的兼容性问题一般无法通过静态链接解决(理论上或许可行),我们只能寻求其他的方法。

符号替换(v3)

为了解决 v2 的问题,我们先用 nm 看看究竟是哪个符号需要 GLIBC 2.14,结果如下:

$ nm main_v2 | grep "GLIBC_2.14" U memcpy@@GLIBC_2.14

可以看到,只有 memcpy 这一个符号,直觉上这个方法的实现不太可能跟着版本在不停更新。在查看 glibc 源码后可以发现,string/memcpy.c 在 2.2.5 -> 2.14 之间都没有任何变化。因此,低版本环境上的 libc.so 其实已经提供了我们需要的 memcpy 的实现,唯一需要解决的就是绕过版本的检查。

对于这一点,可以借助 内联汇编 + 符号指定 来实现。出于篇幅,此处我们直接给出相应地解决代码,具体分析工作可以参考旧版glibc兼容旅程 - CSDN博客。

#ifdef v3 extern "C" { #include <string.h> asm(".symver memcpy, "); void* __wrap_memcpy(void* dest, const void* src, size_t n) { return memcpy(dest, src, n); } } #endif

编译及运行结果:

$ g++ -o main_v3 -static-libstdc++ -Wl,--wrap=memcpy -Dv3 -std=c++11 main.cpp $ ./main_v3: symbol lookup error: ./main_v3: undefined symbol: _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE

还是无法运行......我们来分析一下,显然,这是一个 C++ mangled 符号,按道理应该在我们静态链接 libstdc++ 时已经解决了,为什么依旧会出现呢?

搜了一番后发现了这样一个帖子:SERVER-11641 undefined symbol:
_ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE - MongoDB。有兴趣的同学可以细看一下帖子的内容,就基本能理解这个问题了,这里我简单地复述一遍。

我们把 main_v3 拷贝到两个环境中,然后使用 nm 来查看一下这个符号:

$ nm main_v3 | grep "_ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE" # 上面的是编译环境,下面是运行环境 0000000000680cc0 u _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE 0000000000680cc0 ? _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE

可以发现,中间那个字符有所不同,在高版本的编译环境上,中间的符号是 u,而低版本的运行环境上则是 ?。

从 man nm 中可知,u 表示这个符号是 GNU unique global symbol 类型,这是 GNU 对 ELF 的一个扩展,它会影响到动态链接的过程,换句话说,它会影响到 ld 对动态链接过程的处理。

因为 ld/nm 等命令也是基础环境之一,两个环境上的版本也有不同,低版本的 2.17.50 并没有支持这个扩展,所以 nm 查看的结果显示为未知(?),而 ld 在做动态链接时会抛弃掉这种未知的符号,所以也就出现了未定义符号的问题。

对于这个问题,和 libc.so 一样,我们也没办法去更新 ld,所以还是只能在编译环境中解决此问题。解决的思路就是让 gcc 不要生成这种扩展类型的符号,让运行环境中的 ld 能够识别并链接它。

不生成 Unique Global Symbol(v4)

对于这个需求,从 gcc mail list 的回复中可以看到,并没有这样的编译选项,唯一可行的途径是在编译 gcc 的时候,指定一个
--disable-gnu-unique-object
参数,因此,解决办法就是重新编译一个 gcc...

$ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.8.5/gcc-4.8.5.tar.bz2 $ tar -xjvf gcc-4.8.5.tar.bz2 $ cd gcc-4.8.5 && ./contrib/download_prerequisites $ mkdir build-result && cd build-result $ ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib --disable-gnu-unique-object --prefix=/usr/local/gcc-4.8.5 $ make && sudo make install $ export PATH=/usr/local/gcc-4.8.5:$PATH

唯一需要注意的一点是选择好安装的目录,并且将安装目录的内容 export 到 PATH 中。

使用编译得到的 g++,使用 v3 的编译命令得到 main_v4 后,在运行环境中成功执行。

最后,我们可以直接 nm 比较一下 v3, v4:

$ nm main_v3 | grep "_ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE" 0000000000680cc0 u _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE $ nm main_v4 | grep "_ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE" 000000000067dcc0 V _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE

在 v4 中的符号类型发生了变化,V 代表的 weak object,这个类型可以兼容低版本的 ld。

小结

就我个人感受而言,钻研二进制兼容性更多是个熟悉和理解编译工具以及操作系统所定义规则的过程,远不及设计和实现它们时的难度。但考虑到这个探索的过程也算挺折腾的,所以尽量把能够总结的内容通过本文进行了整理,希望能让读者在后续做相关事情时少才踩些坑。

由于侧重于介绍方法和分析的思路,文中所使用的应用示例比较简单(只考虑了工具链依赖库的范畴),后续有时间会补一篇针对较完善应用的兼容性改造过程,敬请期待。

参考

    Creating portable Linux binaries

    此处的 libc.so 来源于 glibc,而非 Linux 历史上的其他来源,对这段历史感兴趣的同学可以看一下 libc(7)

    旧版glibc兼容旅程 - CSDN博客

    SERVER-11641 undefined symbol: _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE - MongoDB

    Re: --no-gnu-unique option to disable STB_GNU_UNIQUE

另外关于c++ Linux后台服务器开发的一些知识点分享:Linux,Nginx,MySQL,Redis,P2P,K8S,Docker,TCP/IP,协程,DPDK,webrtc,音视频等等视频。

喜欢的朋友可以后台私信【1】获取学习视频

一、会写的字。

搁(耽搁)(搁置)(搁浅)

填(填补)(填空)(填写)

怨(怨恨)(埋怨)(怨言)

掀(掀起)(掀开)

唉(唉声叹气)

裹(包裹)(裹脚)

魁(魁梧)(夺魁)

梧(梧桐)(魁梧)

淋(淋浴)(淋湿)(日晒雨淋)

撕(撕开)(撕扯)(撕碎)

霉(倒霉)(发霉)(青霉素)

虑(焦虑)(顾虑)(忧虑)

悠(悠久)(悠长)(悠闲)

仪(礼仪)(仪表)(仪式)

歉(道歉)(歉意)(歉疚)

溜(溜走)(溜冰)(滑溜)

嘿(嘿!)

割(割开)(收割)(割草)

二、辨字组词。

三、词语积累。

1.近义词。

抱怨——埋怨 忧虑——焦虑

严肃——严厉 沮丧——懊丧

打扰——打搅 羞愧——惭愧

声望——名望 着迷——入迷

悦耳——动听 果然——果真

的确——确实 叮嘱——嘱咐(吩咐)

心惊肉跳——胆战心惊

自作自受——自食其果

自言自语——喃喃自语

流连忘返——恋恋不舍

忐忑不安——坐立不安

蹑手蹑脚——轻手轻脚

兴高采烈——兴致勃勃

无所不知——见多识广

2.反义词。

潮湿——干燥 严肃——活泼

偶然——必然 沮丧——得意

庄重——轻浮 羞愧——骄傲

慈祥——严厉 温柔——粗暴

耐心——厌烦 熟悉——陌生

悦耳——刺耳

寒风呼啸——暖风习习

蹑手蹑脚——大模大样

流连忘返——归心似箭

忐忑不安——镇定自若

兴高采烈——无精打采

3.量词积累。

一(张)帆 一(匹)马

一(片)树林 一(件)事情

一(束)阳光 一(把)锤子

4.词语搭配。

(汹涌澎湃)的海浪 (苍白僵硬)的手

(清新)的海风 (流连忘返)的地方

(瘦削)的脸 (怒目圆睁)的脸

(茫然)的眼睛 (隆重)的仪式

(慈祥)的眼神 (唯一)的听众

(温柔)的嗓音 (蹑手蹑脚)地走出家门

(静静)地坐着/望着(耐心)地回答

(幸福)地歌唱

5.词语归类。

形容心神不安的成语:

忐忑不安 惴惴不安

惊慌失措 六神无主

形容没有变化的词语:

一如既往 一如往日

始终如一 自始至终

无~不~式成语:

无所不知 无所不能

无所不在 无所不及

6.成语盘点。

心惊肉跳 忐忑不安

蹑手蹑脚 流连忘返

一如既往 溜之大吉

一动不动 尽心尽力

无所不知 十指连心

大吃一惊 身无分文

刻苦铭心 兴高采烈

自作自受 不由分说

自言自语 汹涌澎湃

四、日积月累。

轻诺必寡信。《老子》

民无信不立。《论语》

不精不诚,不能动人。《庄子》

诚者,天之道也;

诚之者,人之道也。

《礼记》

有所期诺,纤毫必偿;

有所期约,时刻不易。

《袁氏世范》

五、佳句欣赏。

1.屋外寒风呼啸,汹涌澎湃的海浪拍击着海岸,溅起一阵阵浪花。海上正起着风暴,外面又黑又冷,这间渔家的小屋里却温暖而舒适。地扫得干干净净,炉子里的火还没有熄,食具在搁板上闪闪发亮。挂着白色帐子的床上,五个孩子正在海风呼啸声中安静地睡着。(环境描写)《穷人》

2.桑娜沉思∶丈夫不顾惜身体,冒着寒冷和风暴出去打鱼,她自己也从早到晚地干活,还只能勉强填饱肚子。孩子们没有鞋穿,不论冬夏都光着脚跑来跑去;吃的是黑面包,菜只有鱼。不过,感谢上帝,孩子们都还健康。没什么可抱怨的。(心理描写)《穷人》

3.渔夫皱起眉,他的脸变得严肃、忧虑。“嗯,是个问题!”他搔搔后脑勺说,“嗯,你看怎么办?得把他们抱来,同死人呆在一起怎么行!哦,我们,我们总能熬过去的!快去!别等他们醒来。”(动作/语言/神态描写)《穷人》

4.如果没有他每天早上这宽厚的一笑,我就不会继续白看他的书,也就不会有那刻骨铭心的两个耳光。(假设)《别饿坏了那匹马》

5.林子里静极了。沙沙的足音,听起来像一曲悠悠的小令。(比喻/环境描写)《唯一的听众》

6.我感觉到背后有人,转过身时,吓了一跳:一位极瘦极瘦的老妇人静静地坐在木椅上,平静地望着我。(神态描写)《唯一的听众》

7.她慈祥的眼神平静地望着我,像深深的潭水……《唯一的听众》

8.后来,拉小提琴成了我无法割舍的爱好,我能熟练地拉许多曲子。在各种文艺晚会上,我有机会面对成百上千的观众演奏小提琴曲。那时,我总是不由得想起那位“耳聋”的老人,那清晨里我唯一的听众……(点题)《唯一的听众》

9.一天,我心爱的金丝雀突然死了。我非常难过,心比被锤子砸了的手指还疼。《用心灵去倾听》

10.我相信苏珊的话,我想可爱的小鸟的确到了另一个世界,一个比我们这个世界更为美丽的地方,幸福地歌唱。《用心灵去倾听》

六、课文主题。

《穷人》这篇文章通过记述渔夫和他的妻子桑娜收养邻居西蒙的两个孩子的故事,反映了穷人的悲惨生活和他们在困苦中宁可自己吃苦也要帮助别人的高尚品质。

《别饿坏了那匹马》叙述了残疾青年用善意的谎言让“我”继续看书的故事,赞扬了残疾青年不计一切得失、想方设法让“我”看书的良苦用心,表达了“我”得知真相后的感激之情。

《唯一的听众》记述了“我”在一位音乐教授的真诚帮助下,由一个音乐“白痴”成长为能上台演奏的小提琴手的故事,赞扬了老教授爱护、鼓励年轻人成才的美德,表达了“我”对德高望重的老教授的敬佩、感激之情。

《用心灵去倾听》记述了“我”与问讯处的工作人员苏珊交往的过程,赞美了苏珊用心灵倾听孩子的心声、用爱心帮助孩子的善良品质,表达了“我”对苏珊的深切的怀念之情。

七、单元链接与拓展。

关于自信的名言:

天生我材必有用。——李白

恢弘志士之气,不宜妄自菲薄。——诸葛亮

有信心的人,可以化渺小为伟大,化平庸为神奇。——萧伯纳

一、给画线字注音。(4分)

1.他悄悄地走到厨房,轻轻地掀( )起锅盖,好像一只偷吃的老鼠。

2.在神圣的教堂里,她一个人跪在神像前不停地抱怨( )生活的不公。

3.不知从何时开始,他对手工艺品开始着( )迷。

4.妈妈蹑( )手蹑脚地推开了儿子的房门,为他轻轻地盖好了被子才慢慢地走了出来。

二、看拼音,写词语。(8分)

kuí wǔ jiè yì

( ) ( )

quàn zǔ sī pò

( ) ( )

qīng tīng gē bǎn

( ) ( )

máng rán miǎn qiǎng

( ) ( )

三、根据语境,解释划线词语的意思。(8分)

1.偷看书的时候,羞愧不已的我根本不敢回头去看他那张瘦削的脸。

意思: ________________________

2.一拿到自己挣得的第一笔钱,我泰然地走到精品屋,为妈妈挑选生日礼物。

意思: ________________________

3.通过讨论,他们决定由参会人员中最有声望的人去颁奖典礼。

意思: ________________________

4.屋外寒风呼啸,汹涌澎湃的海浪拍击着海岸,溅起一阵阵浪花。

意思: ________________________

四、先连线,再选词填空。(6分)

心惊 自受

流连 肉跳

十指 忘返

自作 连心

1.惊险的极限挑战活动令人( ),勇敢的挑战者却是镇定自若。

2.即使孩子不小心磕破了皮,母亲都会很心痛,毕竟( )。

五、判断下列句子采用的描写方法,把正确的序号填在括号内。(8分)

①环境描写②语言描写③心理描写④动作描写

1.桑拿沉思:丈夫不顾惜身体,冒着寒冷和风暴出去大鱼,她自己也从早到晚地干活,还只能勉强填饱肚子。 ( )

2.说罢,父亲夺过我手里的书,匆匆地翻了一下,还给那个年轻人,拽着我走了。 ( )

3.我停下来时,她总不忘说上一句:“真不错。我的心已经感受到了。谢谢你,小伙子。” ( )

4.村子里静极了。沙沙的足音,听起来像一曲悠悠的小令。 ( )

六、把下列名句补充完整或填写出处。(8分)

1. _________,不能动人。《庄子》

2.有所期诺,_________ ;

_________,_________ 。

《袁氏世范》

3.“民无信不立”出自_________。

4._________,天之道也;

_________, _________ 。

《礼记》

七、口语交际。(5分)

学校即将举办一次关于“讲诚信与善意的谎言是否相同”的辩论会。有些同学认为“善意的谎言也是一种诚信”,有的同学认为“善意的谎言就是撒谎,是不诚信的表现”,你支持哪一方的观点呢?请说说你的观点及理由。

观点: ______________________

理由: ______________________

八、阅读天地。(23分)

(一)课内阅读。(9分)

《唯一的听众》节选

一天早晨,我蹑手蹑脚地走出家门,心里充满了神圣感,仿佛要去干一件非常伟大的事情。林子里静极了。沙沙的足音,听起来像一曲悠悠的小令。我在一棵树下站好,庄重地架起小提琴,像举行一个隆重的仪式,拉响了第一支曲子。但我很快又沮丧起来,我觉得自己似乎又把锯子带到了树林里。

我感觉到背后有人,转过身时,吓了一跳:一位极瘦极瘦的老妇人静静地坐在木椅上,平静地望着我。我的脸顿时烧起来,心想,这么难听的声音一定破坏了这林中的和谐,一定破坏了这位老人正独享的幽静。

1.“我蹑手蹑脚”的原因是什么?(2分)

2.请找出文中的比喻句用“______ ”画出来,并说说它的好处。(3分)

3.为什么“我”看到有个老人静静地坐在木椅上望着我,顿时感到脸烧?(4分)

(二)课外阅读。(14分)

父亲的爱

①爹不懂得怎样表达爱,使我们一家人融洽相处的是我妈。他只是每天上班下班,而妈则把我们做过的错事开列清单,然后由他来责骂我们。

②有次我偷了块糖果,他要我把它他回去,告诉卖糖的说是我偷的,说我愿意替他拆箱卸货作为赔偿。但妈妈却明白我只是个孩子。

③我在运动场打秋千跌断了腿,在前往医院途中一直抱着我的,是我妈。爹把汽车停在急症室门口,他们叫他驶开,说那空位置是留给紧急车辆停放的。爹听了便叫嚷道:“你以为这是什么车?旅游车?”

④在我的生日会上,爹总是显得有点不太相称。他只是忙于吹气球,布置餐桌,做杂务。把插着蜡烛的蛋糕推过来让我吹的是我妈。

⑤我翻阅照相册时,人们总是问:“你爸爸是什么样子的?”天晓得!他老是忙着替别人拍照,妈和我笑容可掬地一起拍的照片,多得不可胜数。

⑥我记得妈妈有一次叫他教我骑自行车。我叫他别放手,但他却说是应该放手的时候了,我摔到这后,妈跑过来扶我,爸却挥手要她走开。我当时生气极了,决心要给他点颜色看。于是我马上再爬上自行车,而且自己骑给他看,他只是微笑。

⑦我念大学时,所有的家信都是妈写的。他除了寄予支票以外,还寄过一封短柬给我,说因为我没有在草坪上踢足球了,所以他的草坪长得很美。

⑧每次我打电话回家,他似乎都想跟我说话,但结果总是说:“我叫你妈来听。”

⑨我结婚时,掉眼泪的是我妈。他只是大声擤了一下鼻子,便走出房间。

⑩我从小到大都听他说:“你到哪里去了?什么时候回家?汽车有没有汽油?不,不准去。”爹不知道怎样表达我。除非……

1.哪一句话是本文的中心句?用原文回答。(2分)

2.用简短的话概括本文的主要内容?(3分)

3.请写出第六段最后一句话中“微笑”的含义。(4分)

4.文章最后一段的作用是什么?(5分)

九、作文。(30分)

“爱”是人生永恒的主题,生活中,有关爱你的家人,有你关爱的小动物,也有陌生人对你的帮助以及你对陌生人的帮助。我们并不缺少爱,而是缺少真正地体会爱。回忆一下,在你的周围有没有发生哪些让你记忆深刻的事情能够体现“爱”。以“关爱”为话题,写一篇作文,题目自拟。

要求:写清事情的发展过程;注意人物的语言、动作、心理活动等;不少于450字。

参考答案

一、xiān yuàn zháo niè

二、魁梧 介意 劝阻 撕破 倾听 搁板 茫然 勉强

三、1.形容身体或脸很瘦。

2.形容心情十分安定。

3.为众人所仰望的名声。

4.文中形容海风发出高而长的声音,说明寒风猛烈。

五、③④②①

六、不精不诚

纤毫必偿 有所期约,时刻不易

《论语》

诚者 诚之者,人之道也。

七、我赞成善意的谎言也是一种诚信。

谎言是善意的,说明是为了保护一些人不让他们受到伤害,所以这种做法是值得肯定。因此肯定的做法是值得提倡的,所以我认为“善意的谎言也是一种诚信。”

八、(一)

1.“我”害怕惊动家人,发现自己去练琴。

2.沙沙的脚步声,听起来像一曲悠悠的小令。好处:“沙沙的足音”比喻成了“一曲悠悠的小令”,形象地说明“我”对拉好琴重新找回了自信。

3.因为“我”的琴技不好,不希望有人听见自己拉琴,却被老人听见了,让“我”再次失去了自信。

(二)

1.爹不懂得怎样表达爱,使我们一家人融洽相处的是我妈。

2.通过列举了各种种种事实,来表达父亲对“我”的爱。

3.父亲对“我”学会了自行车感到高兴的笑;为我面对失败,能够有再次尝试的勇气而感到骄傲的笑。

4.用疑问的方式总结全文,概括中心,告诉读者父亲不同方式来表达对“我”的爱。

九、作文(略)。

作者:piikee | 分类:游戏攻略 | 浏览:9 | 评论:0