Skip navigation.

Fat R笔记……与减肥无关

Fat awful terrible Rubbish-bin

Posts tagged with "linux"

2.6的Kernel LOGO真容易改

试着改了一下,似乎比2.4容易。2.6的logo数据在/drivers/video/logo里,ppm文件就是logo图像了。每个ppm对应一个.c文件,内容大概就是图像尺寸、调色板、位图数据等信息。.c文件无需自己建立,在make的时候如果不存在某个ppm文件对应的.c文件,就会自动从ppm生成一个,然后把它编译成.o文件。所以看看目录下哪些.ppm文件有同名的.o文件,就说明那个logo被编译进了kernel。标准的224色logo是logo_linux_clut224.ppm,因此修改这个图片就可以实现修改logo了。
在windows下,可以用PaintShopProX直接打开ppm进行编辑,编辑完毕后用decrease color depth命令降为224色,然后保存,把logo_linux_clut224.c删掉,重新make就可以了。这个是我昨晚随便改的logo :


在深入一点点。很容易发现,对于一般的vga console,logo是由drivers/video/fbmem.c里的fb_show_logo()函数显示的,这个函数的调用者是drivers/video/console/fbcon.c(跟2.4差不多,嗯)。这个函数做的事情不多,就是先把非8位色深的位图转换为8位色深,然后用info->fbops->fb_imageblit(info, &image);把logo显示出来,有一个cpu时显示一个logo,有2个cpu时显示2个,以此类推。

略加修改,就可以实现将logo居中显示,并加入一个“重复显示右边界”,也就是把logo最右边4个点宽的区域作为背景填充到整个logo bar。diff如下:
--- /gs2e/source/linux26-2edev/drivers/video/fbmem.c2006-08-29 14:07:15.000000000 +0800
+++ ./fbmem.c2006-09-27 20:40:08.000000000 +0800
@@ -375,9 +375,9 @@
 int fb_show_logo(struct fb_info *info)
 {
 u32 *palette = NULL, *saved_pseudo_palette = NULL;
-unsigned char *logo_new = NULL;
-struct fb_image image;
-int x;
+unsigned char *logo_new = NULL, *border = NULL;
+struct fb_image image, imageborder;
+int x, xoffset;
 
 /* Return if the frame buffer is not mapped or suspended */
 if (fb_logo.logo == NULL || info->state != FBINFO_STATE_RUNNING)
@@ -421,12 +421,45 @@
 image.height = fb_logo.logo->height;
 image.dy = 0;
 
+#ifdef CONFIG_LOGO_REPEAT_RIGHT
+border = kmalloc(4 * fb_logo.logo->height, GFP_KERNEL);
+if (border != NULL){
+  for (x = 0; x < fb_logo.logo->height; x++){ /* use x as y */
+*((u32 *)border + x) = /* will repeat 4 pixels of the right side*/
+*(u32 *)(image.data + (x+1)*fb_logo.logo->width - 4);
+  }
+  imageborder.depth = 8;
+  imageborder.data = border;
+  imageborder.width = 4;
+  imageborder.height = image.height;
+  imageborder.dy = 0;
+  for (x = 0; x < info->var.xres; x+=4){
+imageborder.dx = x;
+info->fbops->fb_imageblit(info, &imageborder);
+  }
+  kfree(border);
+}
+#endif
+#ifndef CONFIG_CENTER_LOGO
+xoffset = 0;
 for (x = 0; x < num_online_cpus() * (fb_logo.logo->width + 8) &&
      x <= info->var.xres-fb_logo.logo->width; x += (fb_logo.logo->width + 8)) {
 image.dx = x;
 info->fbops->fb_imageblit(info, &image);
 }
-
+#else
+xoffset = (info->var.xres - num_online_cpus() * (fb_logo.logo->width + 8))>>1;
+if (xoffset<0)xoffset = 0;
+        for (x = xoffset; x < num_online_cpus() * (fb_logo.logo->width + 8) + xoffset  &&
+             x <= info->var.xres-fb_logo.logo->width+xoffset; x += (fb_logo.logo->width + 8)) {
+               image.dx = x;
+               info->fbops->fb_imageblit(info, &image);
+}
+#endif
 kfree(palette);
 if (saved_pseudo_palette != NULL)
 info->pseudo_palette = saved_pseudo_palette;


我在这里定义了两个配置变量,CONFIG_LOGO_REPEAT_RIGHT和CONFIG_CENTER_LOGO,修改/drivers/video/logo/Kconfig,加上:
config CENTER_LOGO
        bool "Center logo"
        depends on LOGO
        default n
config LOGO_REPEAT_RIGHT
        bool "Repeat the right border (4 pixels)"
        depends on LOGO
        default n

这样就可以在make menuconfig之类的界面中设置是否开启这两项功能了。


更多关于logo hack的信息,可以参考:
http://gentoo-wiki.com/HOWTO_Linux_Logo_Hack

cscope & taglist

cscope的编译和安装没有特别之处,./configure - make - make install即可。
安转完毕后先阅读说明: vi /usr/share/vim/vim63/doc/if_cscop.txt.gz
网上也有中文版本:http://vcd.gro.clinux.org/doc/if_cscop.html
在vim中使用并不需要进行太多的设置,不过首先vim编译时必须加入了cscope的支持
$ vim --version | grep cscope
+cryptv +cscope +dialog_con +diff +digraphs -dnd -ebcdic +emacs_tags +eval

嗯,我用的这个版本的vim是支持cscope的。
根据文档的建议,在~/.vimrc中加入以下内容:
 if has("cscope")
         set csto=0
         set cst
         set nocsverb
         if filereadable("cscope.out")
                 cs add cscope.out
         elseif $CSCOPE_DBPATH != ""
                 cs add $CSCOPE_DBPATH $CSCOPE_DBPATH
         endif
         set csverb
 endif

        nmap <C-[>s :scs find s <C-R>=expand("<cword>")<CR><CR>
        nmap <C-[>g :scs find g <C-R>=expand("<cword>")<CR><CR>
        nmap <C-[>c :scs find c <C-R>=expand("<cword>")<CR><CR>
        nmap <C-[>t :scs find t <C-R>=expand("<cword>")<CR><CR>
        nmap <C-[>e :scs find e <C-R>=expand("<cword>")<CR><CR>
        nmap <C-[>f :scs find f <C-R>=expand("<cfile>")<CR><CR>
        nmap <C-[>d :scs find d <C-R>=expand("<cword>")<CR><CR>

选项说明可以在文档中查到:

'csto' 的值决定 |:cstag| 命令查找的次序。如果 'csto' 被设为 0,cscope 数据库先
被搜索,搜索失败的情况下在搜索标签文件。如果 'csto' 被设为 1,标签文件会在
cscope 数据库之前被搜索。缺省值为 0。
例:
:set csto=0
:set csto=1

这样就会先用cscope搜索,如果失败了再用tag搜索。

若设定了 'cscopetag' 选项,":tag" 命令,CTRL-] 以及 "vim -t" 都会使用 |:cstag|
而不是缺省的 :tag。也就是说,设定 'cst' 选项意味着你总同时搜索 cscope 数据库和
标签文件。缺省值为关。例如:
:set cst
:set nocst

设置了这个选项后,tag的功能就会替换成cstag了(tag命令和cstag命令变成了同一个命令,因此ctrl+]实际上也是调用cstag来处理)

如果 'cscopeverbose' 没有被设定 (缺省情况),当添加一个数据库时,成功与否不会被
显示。理想的情况是,你先在 |.vimrc| 文件中复位该选项,再添加 cscope 数据库,然
后再置位。这样,如果你在使用 vim 当中动态添加数据库,你就会被 vim 告知结果。例
如:
:set csverb
:set nocsverb


cs add $CSCOPE_DBPATH $CSCOPE_DBPATH这行是我自己改的。因为我的cscope.out放在项目的根目录里,不指定pre-path的话cs就会在当前目录下使用相对路径查找文件,指定了pre-path就会使用绝对路径了(或者说把相对路径的参考点指定为了pre-path)。另外,不能写成:
cs add cscope.out $CSCOPE_DBPATH
因为这样cscope会在当前目录下寻找cscope.out

现在可以开始使用了。
跟使用tag一样,要先建立一个数据库:
cd /project_root_dir/
cscope -Rb

如果是kernel源代码,最好加上-k选项来忽略/usr/include(因为kernel不会使用这个目录)
然后就可以vi source.c阅读代码了。
加入vi后,用cs help可以查看帮助,cs show可以查看当前打开的数据库。由于上面对几个cscope命令进行了键绑定,因此可以用ctrl+[,后面跟一个字母键来执行对应的操作。如在函数名foo上按ctrl+[,c,就可以看到调用了这个函数的所有函数。


taglist也是一个有用的插件,可以用来查看tags。安装如下:
# cd /usr/share/vim/vim63/
# unzip taglist_41.zip
# cd doc
# vim

然后在vim中
:helptags .

编辑~/.vimrc,加入:
map <F3> :TlistToggle<cr>

这样,就可以在vim中用[F3]打开taglist窗口,察看tags并在tags间跳转了。按ctrl+w,w(或者连按两下ctrl+w)可以 在taglist和代码窗口间切换。

总结备忘……跟Xserver相关的……

,

之前零零碎碎地记在本子上,还是在这里总结一下吧。

* GUI的应用程序只要安装了依赖的库就可以运行,Xserver不是必须的。可以export DISPLAY=xxx.xxx.xxx.xxx:0来指定远程的Xserver作为输出(Windows下面的XManager就是一个不错的Xserver)。不过有的程序似乎不能在非本地的Xserver上面正常运行,比如狗剩自带的fltv这个mpeg播放软件,只有在本地Xserver上才会有图像。

* 用的Xserver是XFree86(xserver-xfree86_4.3.0.dfsg.1-14sarge1_mipsel.deb),Xorg东西太多,懒得装了……其实还好没装,装了也用不了,因为似乎需要狗剩自己的视频驱动。所以XFree86在启动时会在视频初始化的时候出错退出,最后只好直接把狗剩自带的那个/usr/X11R6/bin/XFree86复制过来用,然而这个XServer里的视频驱动似乎不支持24位色深

* XFree86的配置文件是/etc/X11/XF86Config-4,可以修改显示器、分辨率、鼠标等设置。显卡Device Driver用的是sis(板载显示芯片是sis6326),好像fbdev也许。ps2鼠标可以用/dev/psaux或者/dev/misc/psaux,如果是usb鼠标则可以用/dev/input/mice(ps2鼠标用这个好像不太正常,但有时似乎又能用。另外,Protocol写PS/2居然没有影响)

* 使用usb鼠标需要kernel的支持。如果kernel连usb都不支持,鼠标插上去后会没有任何反应,灯也不亮。kernel的menuconfig中,USB support配置界面应该选上以下项:Support for USB, OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support, USB HIDBP Keyboard (basic) support, USB HIDBP Mouse (basic) support, USB Human Interface Device (full HID) support。另外,General setup里选上Support for hot-pluggable devices(CONFIG_HOTPLUG),否则usb模块会编译错误。Plug and Play configuration里的Plug and Play support最好也选上

* 基本上usb鼠标和usb键盘插上去后就能使用,不需要手动修改配置。然而usb键盘在console下不正常,Caps Lock、Shift等键按下去后就死掉了,而在X下面却不会。是Xserver的键盘驱动兼容性比较好的缘故?解决了,上面HID那里选USB Human Interface Device (full HID) support(CONFIG_USB_HID)就正常鸟……

* 声音与X无关。声音的驱动同样由kernel提供。板载声卡是IT8172,对应kernel选项是Sound下面的IT8172G Sound。打开这个选项后,系统里就会有过/dev/sound/dsp和/dev/sound/mixer(但没有OSS的/dev/audio设备)。在rc.sysinit中加入ln -s /dev/sound/dsp /dev/dspln -s /dev/sound/mixer /dev/mixer两行,这样程序就能利用这两个设备控制音频了。

* Audio Server用的是EsounD(可支持混合多个音频流),单单安装esound-common并不能为enlightenment等程序提供声音,还需要安装esound,并运行esd来启动Audio Server。可以在rc.sysinit中加入esd -as 2 &来随系统启动,-as 2参数表示空闲2秒后释放/dev/dsp,不然esd会一直占用/dev/dsp,这样fltv这种直接使用/dev/dsp来播放音频的软件就不能正常工作。

* startx脚本中指定了xserver启动后运行的x程序,默认是xterm。可以看到一般有这一行:
userclientrc=$HOME/.xinitrc

因此编辑$HOME/.xinitrc,在里面可以设置LANG以及默认的xclient。例如我的是:
export LANG=en_US.ISO-8859-1
blackbox

这样startx后启动的就是blackbox这个window manager。不过我的c libaray不支持locale,不知道怎么解决,郁闷啊……

blackbox的编译……以及一些相关的废话……

,

为什么要编译blackbox呢?因为直接dpkg安装后运行blackbox,它告诉我
blackbox: //lib/libstdc++.so.5: version `GLIBCPP_3.2.2' not found (required by blackbox)
当时没仔细想原因,以为纯粹是编译时用的库版本比现在系统里的版本高,重新编译一下就没事了。于是到http://packages.debian.org把source和patch下回来,xlibs-dev等一堆依赖包安装好,然后打补丁(gunzip <blackbox_0.65.0.orig.tar.gz | patch -p1),接着.configure && make……对狗剩的速度已经心中有数了(编译一个helloworld要十五秒),知道它不花上十几分钟是跑不完那么“艰巨”的编译任务的,于是切换窗口干别的……然而当我再次切换回来的时候,发现已经内存不足down掉了

算了,毕竟总共只有64M的sdram,那么还是交叉编译吧……

由于交叉编译工具链里面没有xlibs-dev等开发库和头文件,就这么configure的话在Checking for X的时候会出错退出,因此首先就要解决这个问题。

已知X的header和lib分别位于/LX-SIS/usr/X11R6/include/LX-SIS/usr/X11R6/lib,gcc可以用参数-I/LX-SIS/usr/X11R6/include -L/LX-SIS/usr/X11R6/lib来指定它们。通过对比分析本地编译和交叉编译configure时生成的config.log和Makefile,发现用以下命令行就可以正确configure了:
$ ./configure --build=i686-linux --host=mipsel-linux --prefix=/LX-SIS/usr/X11R6 --x-includes=/LX-SIS/usr/X11R6/include --x-libraries=/LX-SIS/usr/X11R6/lib


接下来make的时候又出现问题,提示string和vector等文件不存在,看来是交叉编译工具链的libstdc++缺了什么。一开始我采取的措施是把狗剩系统里面的include和lib都ln -s到工具链中(PS一句,debian的那些库好像都是放在/usr/lib下面的,不会去动/lib里面的东西),然而再make还是不行。后来对比了一下工具链的原始文件,才发现问题在哪里。
当初的编译链,有./include,./lib,./mipsel-linux/include,./mipsel-linux/lib四个目录,这四个目录也都能被编译器搜索到。其中./include里面只有c++一个子目录,./lib下面也只有libiberty.a和一个gcc-lib子目录。当时玩glibc的时候mipsel-linux/lib被删掉用新编译的glibc替换,其中的libstdc++等文件(有用的似乎只有libstdc++.a 和libstdc++.so)被我转移到./lib下。 而./include则被我删掉了(大概当时我跟c++有仇 )所以才会丢失那些c++的头文件。把include从旧的工具链复制回来(没有尝试把libstdc++5-3.3-dev_3.3.5-13_mipsel.deb直接拿来用,估计需要重新编译才能),再重新make,这次顺利pass了(一下子就make完了,我一时没反应过来还以为出错了呢……)
然而回到狗剩上执行blackbox,还是提示glibc版本的错误……呃,which一下,我好像执行的是之前dpkg安装的那个blackbox,于是dpkg -P blackbox把它删掉,再试……结果还是老样子

后来又瞄了几眼狗剩的/lib和/usr/lib,看到有/lib/libstdc++.so.5.0.0和/usr/lib//LX-SIS/usr/lib/libstdc++.so.5.0.7 而ldd看到blackbox使用的是前者,也就是5.0.0的那个。由于交叉编译工具链用的是5.0.3,比那个新,所以会出现那个错误。可是之前明明是把libstdc++5_3.3.5-13_mipsel.deb装上去的了啊,为什么还会出现版本不对的错误呢?后来才突然明白过来,现在狗剩这个系统是在一个很小的系统上搭起来的,那个5.0.0是原来那个系统里带的,libstdc++5_3.3.5-13_mipsel.deb是安装到/usr/lib而不是/lib下,而/lib的优先级是最高的,所以那个usr/lib/libstdc++.so.5.0.7就没机会出场了。于是把/lib下面的libstdc++.so.5和libstdc++.so.5.0.0删掉,ldconfig一次,再重新执行blackbox,这次就能运行了。看看/lib,其实里面还有很多旧系统遗留下来的库,看来以后还是要继续小心……

dpkg安装base-passwd时遇到一个奇怪的问题

configure的时候出现的提示是这样的:

Setting up base-passwd (3.5.9) ...
/LX-SIS/usr/lib/db/info/base-passwd.postinst: /LX-SIS/usr/lib/db/info/base-passwd.postinst: 78: tempfile: not found
dpkg: error processing base-passwd (--configure):
 subprocess post-installation script returned error exit status 127
Errors were encountered while processing:
 base-passwd

(嗯,另外啰嗦一句,似乎用busybox的shell来执行,出错时会提示行号,用bash执行就只提示错误信息)

第78行是这样的:
tmp=`tempfile`
if ! update-passwd --dry-run > $tmp ; then
        cat <<EOF


奇怪就奇怪在这里,似乎`...`里面的东西会被执行到..在bash里也一样……
(补充,在命令行下面,``的功能是执行``内的命令,并把返回值作为`...`的实际文本——相当于用命令的返回值替换掉`...`字符串。)
而直接在命令行下执行/LX-SIS/usr/lib/db/info/base-passwd.postinst却又不会出现任何错误提示

于是最后只好把它改成tmp="tempfile",然后dpkg --configure base-passwd,搞定。

总结一下dpkg的安装

dpkg的source可以从debian的网站上获得。
交叉编译时,configure在测试va_copy时会报错退出,那么把退出那行干掉就行了:
--- configure   2005-05-27 01:21:26.000000000 +0800
+++ ../dpkg-1.10.28/configure   2006-08-03 16:11:45.000000000 +0800
@@ -9416,7 +9416,8 @@
 See \`config.log' for more details." >&5
 echo "$as_me: error: cannot run test program while cross compiling
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   #{ (exit 1); exit 1; };
+   }
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */


然后configure就不会出错了
但是由于这个系统毕竟不是debian,没有debiandoc2html这类命令,所以要到doc下把它们干掉,以免后面make的时候过不去

--- ../../dpkg-1.10.28.ori/doc/Makefile.in      2004-11-11 11:16:32.000000000 +0800
+++ Makefile.in 2006-08-04 11:22:57.000000000 +0800
@@ -27,15 +27,15 @@
        echo "<!entity dpkg-version \"$(VERSION)\">" >> $@

 internals.html/index.html: internals.sgml manuals-version
-       debiandoc2html -n -D. $<
+#      debiandoc2html -n -D. $<

 install-doc:
 ifeq (@USE_SGML_DOC@, true)
-       $(mkinstalldirs) $(DESTDIR)$(docdir)/internals/
-       set -e ; for i in internals.html/* ; do \
-               bn=`basename $$i` ; \
-               $(INSTALL_DATA) $$i $(DESTDIR)$(docdir)/internals/$$bn ; \
-       done
+#      $(mkinstalldirs) $(DESTDIR)$(docdir)/internals/
+#      set -e ; for i in internals.html/* ; do \
+#              bn=`basename $$i` ; \
+#              $(INSTALL_DATA) $$i $(DESTDIR)$(docdir)/internals/$$bn ; \
+#      done
 endif
        $(mkinstalldirs) $(DESTDIR)$(docdir)/
        $(INSTALL_DATA) $(srcdir)/ChangeLog $(DESTDIR)$(docdir)/ChangeLog.manuals


接下来可以confiugure了
$ ./configure  --build=i686-linux --host=mipsel-linux --prefix=/LX-SIS/usr


如果编译工具链中已经装好了zlib,bz2lib,ncurses等库,就可以make了。make通过后,make install即可。


把dpkg安装到到狗剩上后,把该建的目录/文件都建了,该改的都改了 (具体参考前面的出错纪实)本来写成了shell script,然而被我不小心删了
(*大概列一下:
  • 建立空文件 /usr/lib/db/status /usr/lib/db/available /var/lib/db/status /var/lib/db/available
  • mkdir /usr/share/info
  • /var/lib/dpkg/info
  • 建立脚本 /usr/bin/update-rc.d
  • 建立 etc/rc{0,1,2,3,4,5,6}.d
  • 把标准的find和expr命令放到$PATH里的目录中,使之能被正确执行到
  • 安装bash,并ln -s /usr/bin/bash /bin/bash (如果安装到了/usr下)
)

首先是用dpkg在狗剩上装dpkg这个软件包。虽然已经通过自己编译产生了dpkg,但dpkg本身并没有dpkg的安装记录,通过安装dpkg的deb包可以产生dpkg的安装记录。

$ dpkg -i --force-depends dpkg_1.10.28_mipsel.deb

如果前面的准备工作都做足了,这一步应该可以pass,用dpkg -l应该能看到dpkg的状态已经是i了。

回到编译主机,重新make install自己编译的dpkg

然后安装 libc6和libdb1-compat
$ dpkg -i libc6_2.3.2.ds1-22sarge3_mipsel.deb libdb1-compat_2.1.3-7_mipsel.deb


这时系统的glibc已经被替换了。回到编译主机,去到glibc的目录重新make install,将glibc覆盖回去。(很奇怪,虽然我用的source也是从debian网站上下回来的,但还是跟deb包的libc6不太兼容,deb包装上去后就会出现“subprocess dpkg-split returned error exit status 64”的错误,从而无法完整的执行完整个安装过程。所以要用自己编译的那个覆盖回去。)

dpkg -l看看glibc的状态是不是已经是U(Unpacked)了。如果是,则可以继续
$ dpkg --configure libc6 libdb1-compat


设置完时区后,再dpkg -l看看,状态应该都是i了。

其实问题就出在deb包的glibc和系统的glibc的不兼容。dpkg在安装libc6的过程中,把系统的glibc替换掉了,然后就无法继续执行下去。所以把glibc覆盖回去后,就可以用dpkg --configure继续完成configure的步骤了(如果dpkg -i,则会重新Unpack,重新覆盖系统的glibc,所以一定要用dpkg --configure)


glibc 2.3.2的mips补丁
http://honk.physik.uni-konstanz.de/linux-mips/glibc/patches/applied/elf-machine-rela-mips.dpatch

#! /bin/sh -e

# DP: 2002-02-04  H.J. Lu  <hjl@gnu.org>
# DP: elf/dl-conflict.c (_dl_resolve_conflicts): Dummy if
# DP: _DL_HAVE_NO_ELF_MACHINE_RELA is defined.

echo $#

if [ $# -ne 2 ]; then
    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
    exit 1
fi
case "$1" in
    -patch) patch -d "$2" -f --no-backup-if-mismatch -p1 < $0;;
    -unpatch) patch -d "$2" -f --no-backup-if-mismatch -R -p1 < $0;;
    *)
echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
exit 1
esac
exit 0

--- libc/elf/dl-conflict.c.mipsMon Feb  4 13:44:57 2002
+++ libc/elf/dl-conflict.cMon Feb  4 15:10:31 2002
@@ -33,6 +33,7 @@ void
 _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict,
        ElfW(Rela) *conflictend)
 {
+#ifndef _DL_HAVE_NO_ELF_MACHINE_RELA
   if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_RELOC, 0))
     _dl_printf ("\nconflict processing: %s\n",
 l->l_name[0] ? l->l_name : _dl_argv[0]);
@@ -63,4 +64,5 @@ _dl_resolve_conflicts (struct link_map *
     for (; conflict < conflictend; ++conflict)
       elf_machine_rela (l, conflict, NULL, NULL, (void *) conflict->r_offset);
   }
+#endif
 }
--- libc/sysdeps/mips/dl-machine.h.mipsMon Feb  4 13:45:18 2002
+++ libc/sysdeps/mips/dl-machine.hMon Feb  4 15:08:39 2002
@@ -56,6 +56,9 @@
 #define ELF_MACHINE_JMP_SLOTR_MIPS_REL32
 #define elf_machine_type_class(type)ELF_RTYPE_CLASS_PLT
 
+/* MIPS doesn't support RELA.  */
+#define _DL_HAVE_NO_ELF_MACHINE_RELA
+
 /* Translate a processor specific dynamic tag to the index
    in l_info array.  */
 #define DT_MIPS(x) (DT_MIPS_##x - DT_LOPROC + DT_NUM)