diff --git a/Demos/CMakeLists.txt b/Demos/CMakeLists.txt index e82271ba16..9f939e84a3 100644 --- a/Demos/CMakeLists.txt +++ b/Demos/CMakeLists.txt @@ -1,4 +1,5 @@ add_subdirectory(Cube) +add_subdirectory(DynamicObject) add_subdirectory(DynamicLink) add_subdirectory(Eyes) add_subdirectory(Fire) diff --git a/Demos/DynamicObject/CMakeLists.txt b/Demos/DynamicObject/CMakeLists.txt new file mode 100644 index 0000000000..9ac8b607b8 --- /dev/null +++ b/Demos/DynamicObject/CMakeLists.txt @@ -0,0 +1,11 @@ +set(SOURCES + main.cpp + ../../Libraries/LibC/crt0_shared.cpp +) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostartfiles -pie -fpic") + +serenity_bin(DynamicObjectDemo) +target_link_libraries(DynamicObjectDemo SampleLib LibCShared) + +add_subdirectory(SampleLib) diff --git a/Demos/DynamicObject/SampleLib/CMakeLists.txt b/Demos/DynamicObject/SampleLib/CMakeLists.txt new file mode 100644 index 0000000000..0233405a7e --- /dev/null +++ b/Demos/DynamicObject/SampleLib/CMakeLists.txt @@ -0,0 +1,11 @@ + +set(SOURCES + lib.cpp +) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostdlib -fpic") + +add_library(SampleLib SHARED ${SOURCES}) +target_link_libraries(SampleLib LibCShared) +#target_link_libraries(SampleLib) +install(TARGETS SampleLib DESTINATION usr/lib) diff --git a/Demos/DynamicObject/SampleLib/lib.cpp b/Demos/DynamicObject/SampleLib/lib.cpp new file mode 100644 index 0000000000..1bfb7693bd --- /dev/null +++ b/Demos/DynamicObject/SampleLib/lib.cpp @@ -0,0 +1,20 @@ + +#include "../lib.h" + +int func(); + +__thread int g_tls1 = 0; +__thread int g_tls2 = 0; + +static void init_function() __attribute__((constructor)); + +void init_function() +{ + g_tls1 = 1; + g_tls2 = 2; +} + +int func() +{ + return 3; +} diff --git a/Demos/DynamicObject/main.cpp b/Demos/DynamicObject/main.cpp new file mode 100644 index 0000000000..c4d401d4ba --- /dev/null +++ b/Demos/DynamicObject/main.cpp @@ -0,0 +1,24 @@ +#include "lib.h" +#include +#include +#include +#include +#include +#include + +int main(int argc, char** argv, char** env) +{ + (void)argc; + (void)argv; + (void)env; + + printf("Well Hello Friends!\n"); + printf("trying to open /etc/fstab for writing..\n"); + int rc = open("/etc/fstab", O_RDWR); + if (rc == -1) { + int _errno = errno; + perror("open failed"); + printf("rc: %d, errno: %d\n", rc, _errno); + return func() + g_tls1 + g_tls2; + } +} diff --git a/Libraries/LibC/CMakeLists.txt b/Libraries/LibC/CMakeLists.txt index 62b6ae9988..f382587fb8 100644 --- a/Libraries/LibC/CMakeLists.txt +++ b/Libraries/LibC/CMakeLists.txt @@ -1,7 +1,7 @@ set(LIBC_SOURCES arpa/inet.cpp assert.cpp - crt0.cpp + #crt0.cpp ctype.cpp cxxabi.cpp dirent.cpp @@ -69,3 +69,6 @@ set(SOURCES ${LIBC_SOURCES} ${AK_SOURCES} ${ELF_SOURCES}) serenity_libc(LibC c) target_link_libraries(LibC crt0) add_dependencies(LibC LibM) + +add_library(LibCShared SHARED ${SOURCES}) +install(TARGETS LibCShared DESTINATION usr/lib) diff --git a/Libraries/LibC/crt0_shared.cpp b/Libraries/LibC/crt0_shared.cpp new file mode 100644 index 0000000000..f38e607d83 --- /dev/null +++ b/Libraries/LibC/crt0_shared.cpp @@ -0,0 +1,30 @@ +#include +#include +#include +#include +#include +#include + +extern "C" { + +int main(int, char**, char**); + +extern void __libc_init(); +extern void _init(); +extern char** environ; +extern bool __environ_is_malloced; + +int _start(int argc, char** argv, char** env); +int _start(int argc, char** argv, char** env) +{ + // asm("int3"); + environ = env; + __environ_is_malloced = false; + + __libc_init(); + _init(); + + int status = main(argc, argv, environ); + return status; +} +}