[oe] [PATCH] uclibc: Get uclibc working in thumb mode.

Khem Raj raj.khem at gmail.com
Fri Mar 20 20:02:46 UTC 2009


	* WARNING!! Do not use bintils 2.19 or 2.19.1
          when compiling in thumb mode. The veneer generation
          does not work as expected. Use binutils 2.18 or binutils_cvs

	* Move LEAD_SONAME into uclibc.inc

	* Use no optimizations while compiling ldso.c
	  to over come a gcc ICE

	* Use ARM mode resolver for thumb mode. The
	  resolver depends on ip register and if we
	  use thumb function for _dl_linux_resolve then
	  it adds a veneer which corrupts ip.
---
 recipes/uclibc/bfin-uclibc_svn.bb                  |    4 +--
 ...so_use_arm_dl_linux_resolve_in_thumb_mode.patch |   21 ++++++++++++++++++++
 recipes/uclibc/files/uclibc_ldso_use_O0.patch      |   13 ++++++++++++
 recipes/uclibc/uclibc.inc                          |    7 +----
 recipes/uclibc/uclibc_0.9.29.bb                    |    4 +--
 recipes/uclibc/uclibc_0.9.30.1.bb                  |    6 ++--
 recipes/uclibc/uclibc_0.9.30.bb                    |    6 ++--
 recipes/uclibc/uclibc_nptl.bb                      |    3 +-
 recipes/uclibc/uclibc_svn.bb                       |    5 +--
 9 files changed, 48 insertions(+), 21 deletions(-)
 create mode 100644 recipes/uclibc/files/ldso_use_arm_dl_linux_resolve_in_thumb_mode.patch
 create mode 100644 recipes/uclibc/files/uclibc_ldso_use_O0.patch

diff --git a/recipes/uclibc/bfin-uclibc_svn.bb b/recipes/uclibc/bfin-uclibc_svn.bb
index 7ab3e8a..9b438a2 100644
--- a/recipes/uclibc/bfin-uclibc_svn.bb
+++ b/recipes/uclibc/bfin-uclibc_svn.bb
@@ -7,7 +7,7 @@
 # on whether the base patches apply to the selected (SRCDATE) svn release.
 #
 UCLIBC_BASE ?= "0.9.29"
-PR = "r4"
+PR = "r5"
 PV = "${UCLIBC_BASE}+svnr${SRCREV}"
 
 require uclibc.inc
@@ -30,5 +30,3 @@ FILESPATH = "${@base_set_filespath([ '${FILE_DIRNAME}/uclibc-${UCLIBC_BASE}', '$
 
 S = "${WORKDIR}/uClibc"
 
-LEAD_SONAME = "libc.so"
-
diff --git a/recipes/uclibc/files/ldso_use_arm_dl_linux_resolve_in_thumb_mode.patch b/recipes/uclibc/files/ldso_use_arm_dl_linux_resolve_in_thumb_mode.patch
new file mode 100644
index 0000000..cfa68ce
--- /dev/null
+++ b/recipes/uclibc/files/ldso_use_arm_dl_linux_resolve_in_thumb_mode.patch
@@ -0,0 +1,21 @@
+Index: uClibc/ldso/ldso/arm/resolve.S
+===================================================================
+--- uClibc.orig/ldso/ldso/arm/resolve.S	2009-03-20 12:03:32.000000000 -0700
++++ uClibc/ldso/ldso/arm/resolve.S	2009-03-20 12:04:23.000000000 -0700
+@@ -97,7 +97,6 @@
+ 
+  .text
+  .align 4      @ 16 byte boundary and there are 32 bytes below (arm case)
+- #if !defined(__thumb__) || defined(__thumb2__)
+  .arm
+  .globl _dl_linux_resolve
+  .type _dl_linux_resolve,%function
+@@ -129,7 +128,7 @@
+ #else
+ 	mov pc,ip
+ #endif
+-#else
++#if 0
+        @ In the thumb case _dl_linux_resolver is thumb.  If a bl is used
+        @ from arm code the linker will insert a stub call which, with
+        @ binutils 2.16, is not PIC.  Since this code is accessed by an
diff --git a/recipes/uclibc/files/uclibc_ldso_use_O0.patch b/recipes/uclibc/files/uclibc_ldso_use_O0.patch
new file mode 100644
index 0000000..7a89e66
--- /dev/null
+++ b/recipes/uclibc/files/uclibc_ldso_use_O0.patch
@@ -0,0 +1,13 @@
+Index: uClibc/ldso/ldso/Makefile.in
+===================================================================
+--- uClibc.orig/ldso/ldso/Makefile.in	2009-02-03 17:27:55.000000000 -0800
++++ uClibc/ldso/ldso/Makefile.in	2009-02-03 17:28:11.000000000 -0800
+@@ -8,7 +8,7 @@
+ CFLAGS-ldso := -DNOT_IN_libc -DIS_IN_rtld $(SSP_DISABLE_FLAGS)
+ 
+ # This stuff will not work with -fomit-frame-pointer
+-CFLAGS-ldso += -fno-omit-frame-pointer
++CFLAGS-ldso += -O0 -fno-omit-frame-pointer
+ 
+ CFLAGS-ldso += -I$(top_srcdir)ldso/ldso/$(TARGET_ARCH) -I$(top_srcdir)ldso/include -I$(top_srcdir)ldso/ldso
+ CFLAGS-ldso += -DUCLIBC_RUNTIME_PREFIX=\"$(RUNTIME_PREFIX)\" -DUCLIBC_LDSO=\"$(UCLIBC_LDSO)\"
diff --git a/recipes/uclibc/uclibc.inc b/recipes/uclibc/uclibc.inc
index 7470ec1..be085ab 100644
--- a/recipes/uclibc/uclibc.inc
+++ b/recipes/uclibc/uclibc.inc
@@ -2,11 +2,6 @@ DESCRIPTION = "C library for embedded systems"
 LICENSE = "LGPL"
 SECTION = "libs"
 PRIORITY = "required"
-
-# I added the line below before and someone removed, but without fixing thumb support
-# So please leave this in till thumb support has REALLY been fixed. ktnxbye, koen
-ARM_INSTRUCTION_SET = "arm"
-
 #
 # For now, we will skip building of a gcc package if it is a uclibc one
 # and our build is not a uclibc one, and we skip a glibc one if our build
@@ -37,6 +32,8 @@ PARALLEL_MAKE = ""
 
 PACKAGES =+ "ldd uclibc-utils-dbg uclibc-utils uclibc-gconv uclibc-thread-db"
 
+LEAD_SONAME = "libc.so"
+
 # The last line (gdb and lib1) is for uclinux-uclibc builds 
 uclibc_baselibs = "/lib/libcrypt*.so* /lib/libdl*.so \
 		   /lib/libintl*.so* /lib/libm*.so \
diff --git a/recipes/uclibc/uclibc_0.9.29.bb b/recipes/uclibc/uclibc_0.9.29.bb
index 256196c..aba1830 100644
--- a/recipes/uclibc/uclibc_0.9.29.bb
+++ b/recipes/uclibc/uclibc_0.9.29.bb
@@ -7,7 +7,7 @@
 # on whether the base patches apply to the selected (SRCDATE) svn release.
 #
 UCLIBC_BASE ?= "0.9.29"
-PR = "r29"
+PR = "r30"
 
 require uclibc.inc
 
@@ -42,5 +42,3 @@ KERNEL_SOURCE = "${STAGING_DIR_HOST}/${exec_prefix}"
 SRC_URI += "http://www.uclibc.org/downloads/uClibc-${PV}.tar.bz2"
 
 S = "${WORKDIR}/uClibc-${UCLIBC_BASE}"
-
-LEAD_SONAME = "libc.so"
diff --git a/recipes/uclibc/uclibc_0.9.30.1.bb b/recipes/uclibc/uclibc_0.9.30.1.bb
index ca01476..d159ab3 100644
--- a/recipes/uclibc/uclibc_0.9.30.1.bb
+++ b/recipes/uclibc/uclibc_0.9.30.1.bb
@@ -7,7 +7,7 @@
 # on whether the base patches apply to the selected (SRCDATE) svn release.
 #
 UCLIBC_BASE ?= "0.9.30.1"
-PR = "r0"
+PR = "r1"
 DEFAULT_PREFERENCE = "1"
 
 require uclibc.inc
@@ -18,6 +18,8 @@ SRC_URI += "file://uClibc.machine file://uClibc.distro \
             file://arm-linuxthreads.patch;patch=1 \
             file://linuxthreads-changes.patch;patch=1 \
 	    file://pthread_atfork.patch;patch=1 \
+	    file://uclibc_ldso_use_O0.patch;patch=1 \
+	    file://ldso_use_arm_dl_linux_resolve_in_thumb_mode.patch;patch=1 \
 	   "
 #recent versions uclibc require real kernel headers
 PACKAGE_ARCH = "${MACHINE_ARCH}"
@@ -29,5 +31,3 @@ KERNEL_SOURCE = "${STAGING_DIR_HOST}/${exec_prefix}"
 SRC_URI += "http://www.uclibc.org/downloads/uClibc-${PV}.tar.bz2"
 
 S = "${WORKDIR}/uClibc-${UCLIBC_BASE}"
-
-LEAD_SONAME = "libc.so"
diff --git a/recipes/uclibc/uclibc_0.9.30.bb b/recipes/uclibc/uclibc_0.9.30.bb
index b3e3c15..bbe809f 100644
--- a/recipes/uclibc/uclibc_0.9.30.bb
+++ b/recipes/uclibc/uclibc_0.9.30.bb
@@ -7,7 +7,7 @@
 # on whether the base patches apply to the selected (SRCDATE) svn release.
 #
 UCLIBC_BASE ?= "0.9.30"
-PR = "r5"
+PR = "r6"
 DEFAULT_PREFERENCE = "1"
 
 require uclibc.inc
@@ -18,6 +18,8 @@ SRC_URI += "file://uClibc.machine file://uClibc.distro \
             file://arm-linuxthreads.patch;patch=1 \
             file://linuxthreads-changes.patch;patch=1 \
 	    file://pthread_atfork.patch;patch=1 \
+	    file://uclibc_ldso_use_O0.patch;patch=1 \
+	    file://ldso_use_arm_dl_linux_resolve_in_thumb_mode.patch;patch=1 \
 	   "
 #recent versions uclibc require real kernel headers
 PACKAGE_ARCH = "${MACHINE_ARCH}"
@@ -29,5 +31,3 @@ KERNEL_SOURCE = "${STAGING_DIR_HOST}/${exec_prefix}"
 SRC_URI += "http://www.uclibc.org/downloads/uClibc-${PV}.tar.bz2"
 
 S = "${WORKDIR}/uClibc-${UCLIBC_BASE}"
-
-LEAD_SONAME = "libc.so"
diff --git a/recipes/uclibc/uclibc_nptl.bb b/recipes/uclibc/uclibc_nptl.bb
index a43a3df..7b3ef15 100644
--- a/recipes/uclibc/uclibc_nptl.bb
+++ b/recipes/uclibc/uclibc_nptl.bb
@@ -29,7 +29,8 @@ SRC_URI += "svn://uclibc.org/branches/;module=uClibc-nptl;rev=${SRCREV} \
             file://uClibc.machine \
             file://uClibc.distro \
             file://uclibc-arm-ftruncate64.patch;patch=1 \
-            file://arm_fix_alignment.patch;patch=1 \
+            file://uclibc_ldso_use_O0.patch;patch=1 \
+	    file://ldso_use_arm_dl_linux_resolve_in_thumb_mode.patch;patch=1 \
             "
 
 S = "${WORKDIR}/uClibc-nptl"
diff --git a/recipes/uclibc/uclibc_svn.bb b/recipes/uclibc/uclibc_svn.bb
index 893c97d..654cb6e 100644
--- a/recipes/uclibc/uclibc_svn.bb
+++ b/recipes/uclibc/uclibc_svn.bb
@@ -29,9 +29,8 @@ SRC_URI += "svn://uclibc.org/trunk;module=uClibc \
 	file://uClibc.machine \
 	file://uClibc.distro \
 	file://uclibc-arm-ftruncate64.patch;patch=1 \
-	file://arm_fix_alignment.patch;patch=1 \
-	file://arm-linuxthreads.patch;patch=1 \
-	file://linuxthreads-changes.patch;patch=1 \
 	file://uclibc_enable_log2_test.patch;patch=1 \
+	file://uclibc_ldso_use_O0.patch;patch=1 \
+	file://ldso_use_arm_dl_linux_resolve_in_thumb_mode.patch;patch=1 \
 	"
 S = "${WORKDIR}/uClibc"
-- 
1.5.4.3





More information about the Openembedded-devel mailing list