Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 23 Jul 2010 17:07:52 +0000 (UTC)
From:      Andriy Gapon <avg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r210423 - in head/sys: boot/common kern
Message-ID:  <201007231707.o6NH7q8r059556@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: avg
Date: Fri Jul 23 17:07:51 2010
New Revision: 210423
URL: http://svn.freebsd.org/changeset/base/210423

Log:
  completely ignore zero-sized elf sections in modules of elf object type (amd64)
  
  Current code doesn't check size of elf sections and may perform needless
  actions of zero-sized memory allocation and similar.
  The bigger issue is that alignment requirement of a zero-sized section
  gets effectively applied to the next section if it has smaller alignment
  requirement.  But other tools, like gdb and consequently kgdb,
  completely ignore zero-sized sections and thus may map symbols to
  addresses differently.
  
  Zero-sized sections are not typical in general.
  Their typical (only, even) cause in FreeBSD modules is inline assembly that
  creates custom sections which is found in pcpu.h and vnet.h.  Mere inclusion
  of one of those header files produces a custom section in elf output.
  If there is no actual use for the section in a given module, then the
  section remains empty.
  
  Better solution is to avoid creating zero-sized sections altogether,
  which is in plans.
  
  Preloaded modules are handled in boot code (load_elf_obj.c), while
  dynamically loaded modules are handled by kernel (link_elf_obj.c).
  
  Based on code by:	np
  MFC after:		3 weeks

Modified:
  head/sys/boot/common/load_elf_obj.c
  head/sys/kern/link_elf_obj.c

Modified: head/sys/boot/common/load_elf_obj.c
==============================================================================
--- head/sys/boot/common/load_elf_obj.c	Fri Jul 23 16:46:42 2010	(r210422)
+++ head/sys/boot/common/load_elf_obj.c	Fri Jul 23 17:07:51 2010	(r210423)
@@ -221,6 +221,8 @@ __elfN(obj_loadimage)(struct preloaded_f
 	for (i = 0; i < hdr->e_shnum; i++)
 		shdr[i].sh_addr = 0;
 	for (i = 0; i < hdr->e_shnum; i++) {
+		if (shdr[i].sh_size == 0)
+			continue;
 		switch (shdr[i].sh_type) {
 		case SHT_PROGBITS:
 		case SHT_NOBITS:

Modified: head/sys/kern/link_elf_obj.c
==============================================================================
--- head/sys/kern/link_elf_obj.c	Fri Jul 23 16:46:42 2010	(r210422)
+++ head/sys/kern/link_elf_obj.c	Fri Jul 23 17:07:51 2010	(r210423)
@@ -555,6 +555,8 @@ link_elf_load_file(linker_class_t cls, c
 	symtabindex = -1;
 	symstrindex = -1;
 	for (i = 0; i < hdr->e_shnum; i++) {
+		if (shdr[i].sh_size == 0)
+			continue;
 		switch (shdr[i].sh_type) {
 		case SHT_PROGBITS:
 		case SHT_NOBITS:
@@ -677,6 +679,8 @@ link_elf_load_file(linker_class_t cls, c
 	/* Size up code/data(progbits) and bss(nobits). */
 	alignmask = 0;
 	for (i = 0; i < hdr->e_shnum; i++) {
+		if (shdr[i].sh_size == 0)
+			continue;
 		switch (shdr[i].sh_type) {
 		case SHT_PROGBITS:
 		case SHT_NOBITS:
@@ -737,6 +741,8 @@ link_elf_load_file(linker_class_t cls, c
 	ra = 0;
 	alignmask = 0;
 	for (i = 0; i < hdr->e_shnum; i++) {
+		if (shdr[i].sh_size == 0)
+			continue;
 		switch (shdr[i].sh_type) {
 		case SHT_PROGBITS:
 		case SHT_NOBITS:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201007231707.o6NH7q8r059556>