gcc的越战

原来越战比滑铁卢糟糕很多。

指引你连失败都没的选择。

好在编程序可以推倒重来,只要你有足够的勇气。

好在我只有我一个人,所以我有足够的勇气。 

 

两条路都需要勇气,一是推到重来,这很必要,因为现在的路确实是错误的。

另一条是争取在现在的方向上尽快回到正确的道路。

 

像我这种优柔寡断的人,必然选择双管齐下。。。。

 

其实时间和环境充裕的话,这个方案完全没有坏处,只是要细心经营,小心翼翼罢了。

并且重建的时候一定要算好编译的参数,不可调来调去,并且希望可以和CLFS保持一致。。。要一点小勇气咯。

但是轻车熟路,应该,很快就搞定了

 

这真是件遗憾的事。。。

 读了之前写给你的信,只是刚刚写的那封没处去寻了。

用手机给你发的,刷手机之后就没有了。。。真是件遗憾的事。

 

现在又对文笔相当的自信,才明白文字是流在感情之外。

以前的文字全都托给秋风,现在的都给你。

有些话,不写就溜走了

 这个感觉是如此的微妙。

我想起了那首歌,好久不见。

于是有种飞到德阳的冲动。

想歌里唱的,我来到你的城市。

只是你去的又是谁的城市。

我想好了一个题目,what next

我的人生会有各种兴奋的波澜,买了苹果电脑,还要买苹果手机。

看完了nba狠沮丧,输了。

还要看世界杯,我总是习惯给自己设定一个目标。

也许这就是我为什么总在有意无意的追求你的原因。

也许这本就是人存在的意义?

日日思君不见君,共饮长江水。

glibc

 

 

 历史证明,这是另一段disgusting 的旅程。。。

 

再恶心的旅程也要记录清楚,否则,下次岂不是更恶心了。。。

 

恶心之处在于,过程狠迷茫,这个工具做出来之后,根本没有人负责,文档很少,怎么编译根本不知道。

只能结合网上的留言来慢慢摸索。

 

之前恶心的几步回头再说,先说说现在恶心的步骤:

glibc要交叉编译,需要glibc-ports的支持,这个包是单独的,下载过后要解压并复制为glibc文件下的ports文件夹。

至于其余的patches从哪里下载和是否需要。。。下段分解。

关于参考文档,一开始觉得,应该是clfs比较正统,但是上面提到的ports再clfs里面并没有提到(是我看的不够仔细还是版本太老?)。

现在发觉龙芯lfs也是蛮正规的,现在两个都参考着呢。。。又报错了:我多么希望一遍到底。。。。

 

找不到config-name.h这个文件。这个文件是用来编译uname的,再仔细一看。。。uname提供的那几个参数基本上都是这个文件里定义的。。。

这个文件是configure glibc的时候自动生成的,这下问题就来了,configure的时候是怎么生成的这个文件呢,为什么我们的情况没又生成呢?

只好先手工写了一个蒙混过关了事。。。噢。。没有了事。。。也没有蒙混。。。这叫做并行处理。。。well done boy

。。。果然又出错了。。。

 

redefinition of "__stat" : 杠杠stat有重复定义, 其中一个定义在 ../include/sys/stat.h里面,另外一个在哪?glibc-2.9/io/stat.c : 50 在这里。。。

那就去glibc里面看看咯:我晕,这个文件就定义了这么一个函数。。。。。。。两个地方确实重复定义了。。看看咯。。。

加了一行 libc_cv_gnu89_inline =yes  到config.cache试试(config.cache是干吗的呢?)。过了,马上又出错了。。。libgcc找不到,这个还蛮乐观。

因为之前就发现在编译gcc442的时候只是编译了 make all-gcc这个target,后来在别人处还发现make  all-target-libgcc这个target

现在终于到了还债的时候了。。好在这个target狠顺利。但是继续报错 , 狠不乐观的看到 -lgcc_eh 找不到了。。。。

这个libgcc_eh.a是要在编译gcc的时候enable-shared才能编出来的。。。好吧。。。重编gcc吧,希望可以成功。。。。或者说可以到下一个错误。。

 

显然glibc没这么好搞定,enable-shared需要crti.o这个文件,这个文件是谁生的?反正不是我。。。。。

这个看lfs狠明白的发现,lfs自己出了个patch把这个链接步骤给屏蔽了。。。。

不幸的是lfs的patch只是针对glibc28版本的,于是折腾到28版本,新的错误产生了。。。。真他妈锻炼人。。。

幸而找到一个29版的patch,打上了,编的风声水气。。。一气呵成。。。。一炮走红。。。总之是过了。。。

 

小忐忑的install一下:没想到这安装也是轰轰烈烈的,好在美出错。。。

再把gcc - full 搞定就算是拿下一城了。。。

结果噩梦 fixincludes又来了。。。。也算老朋友啦,看来要用clfs的几个神补丁来搞定之咯。。。。 

 

 这个和前面那个错误是一样的,crt1.o找不到。是时候搞定这个家伙了。。。

妖精是妖精他妈生的,crt1.o就是glibc生的,glibc的安装文件夹赫然在列,当初拿你没办法,现在可是收到擒来,先用ldconfig试试。

慢着,交叉编译哪来ldconfig???好吧,先用LD_LIBRARY_PATH吧 

貌似要用一个叫做crosstool的东西?问题狠简单,就是ld找不到那个文件而已。。。可是我要怎么和ld对话呢。。。ld,你好。。。

 由config.log 查到 xgcc 的查询路径,并且由查询路径查到,xgcc都再哪里搜索这个crt1.o  再把这些库拷到那里就可以了。。。

这个方法有点亡羊补牢。。。但是还是push through了一点点呢。。。其实这个问题不是无缘无故的造成的。。。

而是由于编译过程中路径的管理过于混乱,所谓路径管理,就是说在confgure的过程中,指定的路径不仅仅会影响到安装过程。

而且,特别是对于编译工具而言,这个路径还会影响到起搜索路径,所以这个prefix在指定的时候要仔细些。

 

下面遇到的问题就比较乐观了,被用来测试的程序不能运行。。。废话,交叉编译当然不能运行啦。。。。

话说回来这个编译出来的a.out到底是哪个平台的?当然是目标平台,否则还链crt1.o干吗。

这就有趣了,我们现在编译的是交叉编译工具,这些工具是在x86平台上运行的编译工具,因此也是x86平台的程序。

那么在配置的阶段,对这个xgcc的测试为什么要用交叉编译呢。。。这显然是不对,不知到是我配置错了,还是配置本来就是错的。。。。

只好改configure文件。。。我妈也不想这样。。。 

这样想来,确实由蹊跷的地方,为什么这个编译过程中xgcc要使用交叉编译?如果不是呢?还有就是为什么xgcc会指到了mips的ld呢。。。。

这个倒是最蹊跷的地方。。。。

 

(6月24号)补充,昨天之前其实还遇到一点,配置后,make ,直接出错,因为glibc-2.10.1的目录里面没有all这个目标。

今天用CLFS时候,也遇到了同样的问题,用了CFLS里面的一个sed招之后就好了:

这句是这样的:

sed -e 's/-lgcc_eh//g' Makeconfig.orig > Makeconfig

很神的一句,先敬下了。。。。

到底要做些什么

 这样的日子无疑是彷徨的。

 

希望找到点方向,有个思路。

集成和测试的工作,就稍作一些好了。

主要还是架构,框架,和优化的方向多留意一些。

但是就是仅仅这些方向,也够每个人喝一壶的。。。

这就要集中精力,把目标和计划指定好。

同时要抱有积极乐观的态度和大胆的破釜沉舟的勇敢。

 

停止抱怨。

找到目标:!这是最重要的。

投入工作。

被打断只能说是运气不好了,当然人的忍耐也是有限度的。

开始决心搞定gcc

看看gcc的层次吧,先把龙芯的那部分就出来咯。

找到龙芯的后端文件和编译选项是个正事。 

老友记 host - build -target

 这三个可真是老朋友,

我只知道,config.sub文件可以用来为某种架构正名(cannonical ?)

这个脚本文件还支持操作系统的目标指认,正规的格式是 config.sub  CPU-MFR-OS

白白折腾一天。。。。还是老老实实从 linux from scratch 做起咯。。。

掉进x漩涡

写个窗口管理器,要对x很熟悉,不管是x-protocal还是x-server。

当然不是放弃,只是这三天的时光,看来是要加些油咯

 

compiz reading

找到了入口

main.c : main () -> addDisplay ()

就在这个函数addDisplay()中,我们找到了向Xserver请求WM的代码,现在这个代码很珍贵的说。。。。

 

	/* Wait for old window manager to go away */

	if (currentWmSnOwner != None)

	{

	    do {

		XWindowEvent (dpy, currentWmSnOwner,

			      StructureNotifyMask, &event);

	    } while (event.type != DestroyNotify);

	}

 

	compCheckForError (dpy);

 

	XCompositeRedirectSubwindows (dpy, XRootWindow (dpy, i),

				      CompositeRedirectManual);

 

	if (compCheckForError (dpy))

	{

	    compLogMessage ("core", CompLogLevelError,

			    "Another composite manager is already "

			    "running on screen: %d", i);

 

	    continue;

	}

 

	XSetSelectionOwner (dpy, cmSnAtom, newCmSnOwner, wmSnTimestamp);

 

 

 in main.c main()

 

    if (!initCore ())
	return 1;

    coreInitialized = TRUE;

    if (!disableSm)
	initSession (clientId);

    if (!addDisplay (displayName))
	return 1;

    eventLoop ();

 

 

放假三天,要折腾点东西出来

今晚就决定要鼓捣啥