Skip to content

Instantly share code, notes, and snippets.

@jessicah
Last active August 29, 2015 14:04
Show Gist options
  • Save jessicah/c4e9a2537dc31cb67338 to your computer and use it in GitHub Desktop.
Save jessicah/c4e9a2537dc31cb67338 to your computer and use it in GitHub Desktop.
runtime_loader: don't use ABI library paths for non-Haiku paths
From 657919e06b43ae94fe6ba3b2e7490c1e8941614f Mon Sep 17 00:00:00 2001
From: Jessica Hamilton <jessica.l.hamilton@gmail.com>
Date: Mon, 21 Jul 2014 09:56:02 +1200
Subject: [PATCH] runtime_loader: only add ABI directories to system library
paths
It only makes sense to add the ABI directories to library paths
created by Haiku itself. E.g. on a gcc2h build, appending x86.
This also fixes build issues where LIBRARY_PATH is amended, and
the target binaries and libraries are in different locations.
---
src/system/libroot/os/find_directory.cpp | 164 ++++++++++++++++++++++++++-
src/system/runtime_loader/Jamfile | 8 +-
src/system/runtime_loader/runtime_loader.cpp | 22 +++-
3 files changed, 190 insertions(+), 4 deletions(-)
diff --git a/src/system/libroot/os/find_directory.cpp b/src/system/libroot/os/find_directory.cpp
index b9890e8..5b61e80 100644
--- a/src/system/libroot/os/find_directory.cpp
+++ b/src/system/libroot/os/find_directory.cpp
@@ -190,7 +190,7 @@ static const char *kUserDirectories[] = {
HOME CONFIG "/var",
};
-
+#ifndef _LOADER_MODE
/*! make dir and its parents if needed */
static int
create_path(const char *path, mode_t mode)
@@ -224,7 +224,6 @@ create_path(const char *path, mode_t mode)
return 0;
}
-
static size_t
get_user_home_path(char* buffer, size_t bufferSize)
{
@@ -512,3 +511,164 @@ DEFINE_LIBROOT_KERNEL_SYMBOL_VERSION("__find_directory_alpha4",
DEFINE_LIBROOT_KERNEL_SYMBOL_VERSION("__find_directory", "find_directory@@",
"1_ALPHA5");
+#else
+status_t
+__find_directory(directory_which which, dev_t device, bool createIt,
+ char *returnedPath, int32 _pathLength)
+{
+ if (_pathLength <= 0)
+ return E2BIG;
+ size_t pathLength = _pathLength;
+
+ const char *templatePath = NULL;
+
+ /* as with the R5 version, no on-stack buffer */
+ char *buffer = (char*)malloc(pathLength);
+ if (buffer == NULL)
+ return B_NO_MEMORY;
+ MemoryDeleter bufferDeleter(buffer);
+
+ memset(buffer, 0, pathLength);
+
+ strlcat(buffer, "/boot", pathLength);
+
+ switch ((int)which) {
+ /* Haiku system directories */
+ case B_SYSTEM_DIRECTORY:
+ case B_BEOS_SYSTEM_DIRECTORY:
+ case B_SYSTEM_ADDONS_DIRECTORY:
+ case B_SYSTEM_BOOT_DIRECTORY:
+ case B_SYSTEM_FONTS_DIRECTORY:
+ case B_SYSTEM_LIB_DIRECTORY:
+ case B_SYSTEM_SERVERS_DIRECTORY:
+ case B_SYSTEM_APPS_DIRECTORY:
+ case B_SYSTEM_BIN_DIRECTORY:
+ case B_BEOS_ETC_DIRECTORY:
+ case B_SYSTEM_DOCUMENTATION_DIRECTORY:
+ case B_SYSTEM_PREFERENCES_DIRECTORY:
+ case B_SYSTEM_TRANSLATORS_DIRECTORY:
+ case B_SYSTEM_MEDIA_NODES_DIRECTORY:
+ case B_SYSTEM_SOUNDS_DIRECTORY:
+ case B_SYSTEM_DATA_DIRECTORY:
+ case B_SYSTEM_DEVELOP_DIRECTORY:
+ case B_SYSTEM_PACKAGES_DIRECTORY:
+ case B_SYSTEM_HEADERS_DIRECTORY:
+ templatePath = kSystemDirectories[which - B_SYSTEM_DIRECTORY];
+ break;
+
+ /* Obsolete common directories and writable system directories */
+ case B_COMMON_DIRECTORY:
+ case B_COMMON_SYSTEM_DIRECTORY:
+ case B_COMMON_ADDONS_DIRECTORY:
+ case B_COMMON_BOOT_DIRECTORY:
+ case B_COMMON_FONTS_DIRECTORY:
+ case B_COMMON_LIB_DIRECTORY:
+ case B_COMMON_SERVERS_DIRECTORY:
+ case B_COMMON_BIN_DIRECTORY:
+ case B_SYSTEM_ETC_DIRECTORY:
+ case B_COMMON_DOCUMENTATION_DIRECTORY:
+ case B_SYSTEM_SETTINGS_DIRECTORY:
+ case B_COMMON_DEVELOP_DIRECTORY:
+ case B_SYSTEM_LOG_DIRECTORY:
+ case B_SYSTEM_SPOOL_DIRECTORY:
+ case B_SYSTEM_TEMP_DIRECTORY:
+ case B_SYSTEM_VAR_DIRECTORY:
+ case B_COMMON_TRANSLATORS_DIRECTORY:
+ case B_COMMON_MEDIA_NODES_DIRECTORY:
+ case B_COMMON_SOUNDS_DIRECTORY:
+ case B_COMMON_DATA_DIRECTORY:
+ case B_SYSTEM_CACHE_DIRECTORY:
+ case B_COMMON_PACKAGES_DIRECTORY:
+ case B_COMMON_HEADERS_DIRECTORY:
+ case B_SYSTEM_NONPACKAGED_DIRECTORY:
+ case B_SYSTEM_NONPACKAGED_ADDONS_DIRECTORY:
+ case B_SYSTEM_NONPACKAGED_TRANSLATORS_DIRECTORY:
+ case B_SYSTEM_NONPACKAGED_MEDIA_NODES_DIRECTORY:
+ case B_SYSTEM_NONPACKAGED_BIN_DIRECTORY:
+ case B_SYSTEM_NONPACKAGED_DATA_DIRECTORY:
+ case B_SYSTEM_NONPACKAGED_FONTS_DIRECTORY:
+ case B_SYSTEM_NONPACKAGED_SOUNDS_DIRECTORY:
+ case B_SYSTEM_NONPACKAGED_DOCUMENTATION_DIRECTORY:
+ case B_SYSTEM_NONPACKAGED_LIB_DIRECTORY:
+ case B_SYSTEM_NONPACKAGED_HEADERS_DIRECTORY:
+ case B_SYSTEM_NONPACKAGED_DEVELOP_DIRECTORY:
+ templatePath = kCommonDirectories[which - B_COMMON_DIRECTORY];
+ break;
+
+ /* User directories */
+ case B_USER_DIRECTORY:
+ case B_USER_CONFIG_DIRECTORY:
+ case B_USER_ADDONS_DIRECTORY:
+ case B_USER_BOOT_DIRECTORY:
+ case B_USER_FONTS_DIRECTORY:
+ case B_USER_LIB_DIRECTORY:
+ case B_USER_SETTINGS_DIRECTORY:
+ case B_USER_DESKBAR_DIRECTORY:
+ case B_USER_PRINTERS_DIRECTORY:
+ case B_USER_TRANSLATORS_DIRECTORY:
+ case B_USER_MEDIA_NODES_DIRECTORY:
+ case B_USER_SOUNDS_DIRECTORY:
+ case B_USER_DATA_DIRECTORY:
+ case B_USER_CACHE_DIRECTORY:
+ case B_USER_PACKAGES_DIRECTORY:
+ case B_USER_HEADERS_DIRECTORY:
+ case B_USER_DEVELOP_DIRECTORY:
+ case B_USER_DOCUMENTATION_DIRECTORY:
+ case B_USER_NONPACKAGED_DIRECTORY:
+ case B_USER_NONPACKAGED_ADDONS_DIRECTORY:
+ case B_USER_NONPACKAGED_TRANSLATORS_DIRECTORY:
+ case B_USER_NONPACKAGED_MEDIA_NODES_DIRECTORY:
+ case B_USER_NONPACKAGED_BIN_DIRECTORY:
+ case B_USER_NONPACKAGED_DATA_DIRECTORY:
+ case B_USER_NONPACKAGED_FONTS_DIRECTORY:
+ case B_USER_NONPACKAGED_SOUNDS_DIRECTORY:
+ case B_USER_NONPACKAGED_DOCUMENTATION_DIRECTORY:
+ case B_USER_NONPACKAGED_LIB_DIRECTORY:
+ case B_USER_NONPACKAGED_HEADERS_DIRECTORY:
+ case B_USER_NONPACKAGED_DEVELOP_DIRECTORY:
+ case B_USER_SERVERS_DIRECTORY:
+ case B_USER_APPS_DIRECTORY:
+ case B_USER_BIN_DIRECTORY:
+ case B_USER_PREFERENCES_DIRECTORY:
+ case B_USER_ETC_DIRECTORY:
+ case B_USER_LOG_DIRECTORY:
+ case B_USER_SPOOL_DIRECTORY:
+ case B_USER_VAR_DIRECTORY:
+ templatePath = kUserDirectories[which - B_USER_DIRECTORY];
+ break;
+
+ default:
+ return EINVAL;
+ }
+
+ if (templatePath == NULL)
+ return ENOENT;
+
+ PathBuffer pathBuffer(buffer, pathLength, strlen(buffer));
+
+ // resolve "$h" placeholder to the user's home directory
+ if (!strncmp(templatePath, "$h", 2)) {
+ pathBuffer.Append("/home");
+ templatePath += 2;
+ } else if (templatePath[0] != '\0')
+ pathBuffer.Append('/');
+
+ // resolve "$a" placeholder to the architecture subdirectory, if not
+ // primary
+ if (char* dollar = strchr(templatePath, '$')) {
+ if (dollar[1] == 'a') {
+ pathBuffer.Append(templatePath, dollar - templatePath);
+ templatePath = dollar + 2;
+ }
+ }
+
+ // append (remainder of) template path
+ pathBuffer.Append(templatePath);
+
+ if (pathBuffer.Length() >= pathLength)
+ return E2BIG;
+
+ strlcpy(returnedPath, buffer, pathLength);
+ return B_OK;
+}
+#endif
diff --git a/src/system/runtime_loader/Jamfile b/src/system/runtime_loader/Jamfile
index da25b1f..1d8c99f 100644
--- a/src/system/runtime_loader/Jamfile
+++ b/src/system/runtime_loader/Jamfile
@@ -5,8 +5,12 @@ local architecture = $(TARGET_PACKAGING_ARCH) ;
UsePrivateHeaders libroot runtime_loader shared ;
UsePrivateHeaders kernel ;
# for <util/KMessage.h>
+UsePrivateHeaders libroot os ;
+ # for "PathBuffer.h"
UsePrivateSystemHeaders ;
+ObjectHdrs find_directory.cpp : $(HAIKU_TOP)/src/system/libroot/os ;
+
# Don't let gcc inject built-in function code. This will cause dependencies
# to libroot, which we don't link against.
SubDirCcFlags -fno-builtin ;
@@ -25,6 +29,7 @@ StaticLibrary libruntime_loader.a :
kernel_vsprintf.cpp
kernel_cpp.cpp
KMessage.cpp
+ find_directory.cpp
:
<src!system!libroot!os!$(architecture)>mutex.o
<src!system!libroot!os!$(architecture)>recursive_lock.o
@@ -68,7 +73,8 @@ SEARCH on [ FGristFiles kernel_vsprintf.cpp ]
= [ FDirName $(HAIKU_TOP) src system kernel lib ] ;
SEARCH on [ FGristFiles KMessage.cpp ]
= [ FDirName $(HAIKU_TOP) src system kernel messaging ] ;
-
+SEARCH on [ FGristFiles find_directory.cpp ]
+ = [ FDirName $(HAIKU_TOP) src system libroot os ] ;
local sources =
add_ons.cpp
diff --git a/src/system/runtime_loader/runtime_loader.cpp b/src/system/runtime_loader/runtime_loader.cpp
index 16bb18f..bd1318d 100644
--- a/src/system/runtime_loader/runtime_loader.cpp
+++ b/src/system/runtime_loader/runtime_loader.cpp
@@ -16,6 +16,7 @@
#include <algorithm>
#include <ByteOrder.h>
+#include <find_directory_private.h>
#include <directories.h>
#include <image_defs.h>
@@ -33,6 +34,17 @@ void *__dso_handle;
int32 __gCPUCount = 1;
+const directory_which kLibraryDirectories[] = {
+ B_SYSTEM_LIB_DIRECTORY,
+ B_SYSTEM_NONPACKAGED_LIB_DIRECTORY,
+ B_USER_LIB_DIRECTORY,
+ B_USER_NONPACKAGED_LIB_DIRECTORY,
+ B_SYSTEM_DEVELOP_DIRECTORY,
+ B_SYSTEM_NONPACKAGED_DEVELOP_DIRECTORY,
+ B_USER_NONPACKAGED_DEVELOP_DIRECTORY,
+ B_USER_DEVELOP_DIRECTORY
+};
+
static const char *
search_path_for_type(image_type type)
@@ -175,7 +187,15 @@ try_open_executable(const char *dir, int dirLength, const char *name,
// not been compiled with a compiler using the same ABI as the one
// the OS has been built with. Thus we only look in subdirs
// specific to that ABI.
- subDirLen = strlen(abiSpecificSubDir) + 1;
+ // However, only if it's a known library location
+ for (int i = 0; i < 8; ++i) {
+ char buffer[PATH_MAX];
+ __find_directory(kLibraryDirectories[i], -1, false, buffer, PATH_MAX);
+ if (strncmp(dir, buffer, dirLength) == 0) {
+ subDirLen = strlen(abiSpecificSubDir) + 1;
+ break;
+ }
+ }
}
if (dirLength + 1 + subDirLen + nameLength >= pathLength)
--
1.9.1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment