[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] livepatch-tools: Handle new files in patch sets



If you create a Xen patch for livepatch that adds additional files to the build (adds the files and patches the Makefile to include them), the livepatch tools (from https://github.com/rosslagerwall/livepatch-build-tools) do not properly handle this.  They ignore the new files in the patched/ output directory, as the script only lists object files from the original/ directory.

After some investigation and experimenting, it seems the easiest way to resolve this issue is to list the object files in the patched/ directory (instead of the original/ directory), and if the source object file does not exist in the original/ directory, create an object file of the proper name from an empty .c file.  The create-diff-object step works properly against this.  Note that this method does not handle the removal of object files via the patching process.

I've created a simple patch to livepatch-build that adds this capability.  Directly calling gcc may not be the correct approach in all situations (the patch tools require the compiler version to match between object files), but it works for my environment (a XenServer build system using the system gcc).

Please let me know if you have any other questions about this particular issue.  I am happy to provide additional information if needed.

-Bit

=========================

+++ livepatch-build    2017-06-28 15:20:31.797362000 -0600
@@ -117,7 +117,7 @@
     [[ -e "${OUTPUT}/original/changed_objs" ]] || die "no changed objects found"
     [[ -e "${OUTPUT}/patched/changed_objs" ]] || die "no changed objects found"
 
-    cd "${OUTPUT}/original" || die
+    cd "${OUTPUT}/patched" || die
     FILES="$(find xen -type f -name "*.o")"
     cd "${OUTPUT}" || die
     CHANGED=0
@@ -129,6 +129,15 @@
         mkdir -p "output/$(dirname $i)" || die
         echo "Processing ${i}"
         echo "Run create-diff-object on $i" >> "${OUTPUT}/create-diff-object.log"
+        # Create an empty object file if none exists.
+        if [[ ! -e "original/$i" ]]; then
+            echo "Creating object file original/$i with no content."
+            TEMPPATH="$(mktemp -d /tmp/xenbuild.XXXXXX)"
+            touch "${TEMPPATH}/empty.c"
+            gcc -g -m64 -ffunction-sections -fdata-sections -c "${TEMPPATH}/empty.c" -o "original/$i"
+            rm "${TEMPPATH}/empty.c"
+            rmdir "${TEMPPATH}"
+        fi
         "${TOOLSDIR}"/create-diff-object $debugopt $PRELINK "original/$i" "patched/$i" "$XENSYMS" "output/$i" &>> "${OUTPUT}/create-diff-object.log"
         rc="${PIPESTATUS[0]}"
         if [[ $rc = 139 ]]; then

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.