My environment is Ubuntu15.10.
I wrote the following source code.
#include "efi.h"
#include "efilib.h"
EFI_STATUS
EFIAPI
efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
InitializeLib(ImageHandle, SystemTable);
Print(L"HelloWorld\n");
return EFI_SUCCESS;
}
I wrote the following Makefile and compile source code.
ARCH = $(shell uname -m | sed s,i[3456789]86,ia32,)
OBJS = main.o
TARGET = hello.efi
EFIINC = /usr/include/efi
EFIINCS = -I$(EFIINC) -I$(EFIINC)/$(ARCH) -I$(EFIINC)/protocol
EFILIB = /usr/lib
EFI_CRT_OBJS = $(EFILIB)/crt0-efi-$(ARCH).o
EFI_LDS = $(EFILIB)/elf_$(ARCH)_efi.lds
CFLAGS = $(EFIINCS) -fno-stack-protector -fpic \
-fshort-wchar -mno-red-zone -Wall
ifeq ($(ARCH),x86_64)
CFLAGS += -DEFI_FUNCTION_WRAPPER
endif
LDFLAGS = -nostdlib -znocombreloc -T $(EFI_LDS) -shared \
-Bsymbolic -L $(EFILIB) -L $(LIB) $(EFI_CRT_OBJS)
all: $(TARGET)
hello.so:$(OBJS)
ld $(LDFLAGS) $(OBJS) -o $# -lefi -lgnuefi
%.efi: %.so
objcopy -j .text -j .sdata -j .data -j .dynamic \
-j .dynsym -j .rel -j .rela -j .reloc \
--target=efi-app-$(ARCH) $^ $#
I store hello.efi on named RT directory and I run "qemu-system-x86_64 -bios OVMF.fd -hda fat:RT/".
I run hello.efi but not execute my UEFI application.
Qemu say "Error reported: Invalud Parameter".
Please help me!
Removing -L $(LIB) from the LDFLAGS in the Makefile helped:
Don't you need 'main()' vs. 'efi_main()'?
Related
I am using this workflow: cmake_build.yaml
Here is my toplevel CMakeLists.txt:
cmake_minimum_required(VERSION 3.15)
project(
container
VERSION 0.1.0
DESCRIPTION "An extension to the standard container library in c++"
HOMEPAGE_URL ""
LANGUAGES CXX
)
add_executable(${PROJECT_NAME} src/main.cpp)
set_target_properties(
${PROJECT_NAME}
PROPERTIES
LINKER_LANGUAGE CXX
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE}"
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE}"
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE}"
)
target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_17)
target_include_directories(
${PROJECT_NAME}
PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src
)
install(
DIRECTORY
include/${PROJECT_NAME_LOWERCASE}
DESTINATION
include
)
enable_testing()
add_subdirectory(test)
and test/CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(my_project)
# GoogleTest requires at least C++14
set(CMAKE_CXX_STANDARD 17)
include(FetchContent)
FetchContent_Declare(
googletest
URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
add_executable(
hello_test
hello_test.cc
)
target_link_libraries(
hello_test
GTest::gtest_main
)
include(GoogleTest)
gtest_discover_tests(hello_test)
I am using the example from gtest docs:
test/hello_test.cc:
#include <gtest/gtest.h>
TEST(HelloTest, BasicAssertions) {
// Expect two strings not to be equal.
EXPECT_STRNE("hello", "world");
// Expect equality.
EXPECT_EQ(7 * 6, 42);
}
int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
It builds fine on Windows MSVC, Macos Clang, Linux GCC, but fails using Mingw GCC, here is error shown:
FAILED: test/hello_test.exe test/hello_test[1]_tests.cmake D:/a/tsst/tsst/build/test/hello_test[1]_tests.cmake
cmd.exe /C "cd . && C:\ProgramData\chocolatey\bin\g++.exe -O3 -DNDEBUG test/CMakeFiles/hello_test.dir/hello_test.cc.obj -o test\hello_test.exe -Wl,--out-implib,test\libhello_test.dll.a -Wl,--major-image-version,0,--minor-image-version,0 lib/libgtest_main.a lib/libgtest.a -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cmd.exe /C "cd /D D:\a\tsst\tsst\build\test && D:\a\tsst\tsst\cmake-3.24.3-windows-x86_64\bin\cmake.exe -D TEST_TARGET=hello_test -D TEST_EXECUTABLE=D:/a/tsst/tsst/build/test/hello_test.exe -D TEST_EXECUTOR= -D TEST_WORKING_DIR=D:/a/tsst/tsst/build/test -D TEST_EXTRA_ARGS= -D TEST_PROPERTIES= -D TEST_PREFIX= -D TEST_SUFFIX= -D TEST_FILTER= -D NO_PRETTY_TYPES=FALSE -D NO_PRETTY_VALUES=FALSE -D TEST_LIST=hello_test_TESTS -D CTEST_FILE=D:/a/tsst/tsst/build/test/hello_test[1]_tests.cmake -D TEST_DISCOVERY_TIMEOUT=5 -D TEST_XML_OUTPUT_DIR= -P D:/a/tsst/tsst/cmake-3.24.3-windows-x86_64/share/cmake-3.24/Modules/GoogleTestAddTests.cmake""
CMake Error at D:/a/tsst/tsst/cmake-3.24.3-windows-x86_64/share/cmake-3.24/Modules/GoogleTestAddTests.cmake:112 (message):
Error running test executable.
Path: 'D:/a/tsst/tsst/build/test/hello_test.exe'
Result: Exit code 0xc0000139
Output:
Call Stack (most recent call first):
D:/a/tsst/tsst/cmake-3.24.3-windows-x86_64/share/cmake-3.24/Modules/GoogleTestAddTests.cmake:225 (gtest_discover_tests_impl)
ninja: build stopped: subcommand failed.
Build works fine without building gtest, and it fails when building test executable with gtest
I am getting the following exception while building the ROM for a lineageos project and need some help diagnosing and resolving the issue:
FAILED: /home/lineageos/out/target/product/tb8504f/obj_arm/SHARED_LIBRARIES/audio.primary.msm8937_intermediates/audio_extn/utils.o
/bin/bash -c "PWD=/proc/self/cwd prebuilts/misc/linux-x86/ccache/ccache prebuilts/clang/host/linux-x86/clang-4053586/bin/clang -I device/lenovo/tb8504f/include -I /home/lineageos/out/target/product/tb8504f/obj/KERNEL_OBJ/usr/include -I /home/lineageos/out/target/product/tb8504f/obj/KERNEL_OBJ/usr/techpack/audio/include -I /home/lineageos/out/target/product/tb8504f/obj/vendor/qcom/opensource/audio-kernel/include -I external/tinyalsa/include -I external/tinycompress/include -I system/media/audio_utils/include -I external/expat/lib -I hardware/libhardware/include -I system/media/audio_route/include -I system/media/audio_effects/include -I hardware/qcom/audio-caf/msm8996/hal/msm8916 -I hardware/qcom/audio-caf/msm8996/hal/audio_extn -I hardware/qcom/audio-caf/msm8996/hal/voice_extn -I /home/lineageos/out/target/product/tb8504f/obj/include/mm-audio/sound_trigger -I hardware/qcom/audio-caf/msm8996/hal -I /home/lineageos/out/target/product/tb8504f/obj_arm/SHARED_LIBRARIES/audio.primary.msm8937_intermediates -I /home/lineageos/out/target/product/tb8504f/gen/SHARED_LIBRARIES/audio.primary.msm8937_intermediates -I libnativehelper/include_deprecated \$(cat /home/lineageos/out/target/product/tb8504f/obj_arm/SHARED_LIBRARIES/audio.primary.msm8937_intermediates/import_includes) -I system/core/include -I system/media/audio/include -I hardware/libhardware_legacy/include -I hardware/ril/include -I libnativehelper/include -I frameworks/native/include -I frameworks/native/opengl/include -I frameworks/av/include -isystem /home/lineageos/out/target/product/tb8504f/obj/include -isystem bionic/libc/arch-arm/include -isystem bionic/libc/include -isystem bionic/libc/kernel/uapi -isystem bionic/libc/kernel/uapi/asm-arm -isystem bionic/libc/kernel/android/scsi -isystem bionic/libc/kernel/android/uapi -c -fno-exceptions -Wno-multichar -ffunction-sections -fdata-sections -funwind-tables -fstack-protector-strong -Wa,--noexecstack -Werror=format-security -D_FORTIFY_SOURCE=2 -fno-short-enums -no-canonical-prefixes -DNDEBUG -g -Wstrict-aliasing=2 -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith -DNDEBUG -UDEBUG -fdebug-prefix-map=/proc/self/cwd= -D__compiler_offsetof=__builtin_offsetof -Werror=int-conversion -Wno-reserved-id-macro -Wno-format-pedantic -Wno-unused-command-line-argument -fcolor-diagnostics -Wno-expansion-to-defined -fdebug-prefix-map=\$PWD/= -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Werror=date-time -nostdlibinc -msoft-float -mfloat-abi=softfp -mfpu=neon -mcpu=cortex-a53 -mfpu=neon-fp-armv8 -D__ARM_FEATURE_LPAE=1 -target arm-linux-androideabi -Bprebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/arm-linux-androideabi/bin -std=gnu99 -O2 -fomit-frame-pointer -fstrict-aliasing -DPLATFORM_MSM8916 -DUSE_VENDOR_EXTN -DHDMI_EDID -DUSE_LL_AS_PRIMARY_OUTPUT -DPCM_OFFLOAD_ENABLED -DANC_HEADSET_ENABLED -DHIFI_AUDIO_ENABLED -DVBAT_MONITOR_ENABLED -DFLUENCE_ENABLED -DAFE_PROXY_ENABLED -DKPI_OPTIMIZE_ENABLED -DFM_POWER_OPT -DHFP_ENABLED -DCUSTOM_STEREO_ENABLED -DMULTI_VOICE_SESSION_ENABLED -DCOMPRESS_VOIP_ENABLED -DAUDIO_EXTN_FORMATS_ENABLED -DSPKR_PROT_ENABLED -DHW_VARIANTS_ENABLED -DFLAC_OFFLOAD_ENABLED -DCOMPRESS_METADATA_NEEDED -DFLAC_OFFLOAD_ENABLED -DCOMPRESS_METADATA_NEEDED -DVORBIS_OFFLOAD_ENABLED -DCOMPRESS_METADATA_NEEDED -DWMA_OFFLOAD_ENABLED -DCOMPRESS_METADATA_NEEDED -DALAC_OFFLOAD_ENABLED -DCOMPRESS_METADATA_NEEDED -DAPE_OFFLOAD_ENABLED -DCOMPRESS_METADATA_NEEDED -DPCM_OFFLOAD_ENABLED_24 -DDEV_ARBI_ENABLED -DDOLBY_ACDB_LICENSE -DDS2_DOLBY_DAP_ENABLED -DDS1_DOLBY_DDP_ENABLED -DSOURCE_TRACKING_ENABLED -DAUDIO_EXTERNAL_HDMI_ENABLED -DSOUND_TRIGGER_ENABLED -DSOUND_TRIGGER_PLATFORM_NAME=msm8937 -Wall -Werror -fPIC -D_USING_LIBCXX -Wno-unused-variable -Wno-unused-function -Wno-missing-field-initializers -DANDROID_STRICT -Werror=int-to-pointer-cast -Werror=pointer-to-int-cast -Werror=address-of-temporary -Werror=return-type -MD -MF /home/lineageos/out/target/product/tb8504f/obj_arm/SHARED_LIBRARIES/audio.primary.msm8937_intermediates/audio_extn/utils.d -o /home/lineageos/out/target/product/tb8504f/obj_arm/SHARED_LIBRARIES/audio.primary.msm8937_intermediates/audio_extn/utils.o hardware/qcom/audio-caf/msm8996/hal/audio_extn/utils.c"
hardware/qcom/audio-caf/msm8996/hal/audio_extn/utils.c:1336:14: error: use of undeclared identifier 'SND_AUDIOCODEC_DSD'
id = SND_AUDIOCODEC_DSD;
^
hardware/qcom/audio-caf/msm8996/hal/audio_extn/utils.c:1339:14: error: use of undeclared identifier 'SND_AUDIOCODEC_APTX'
id = SND_AUDIOCODEC_APTX;
^
2 errors generated.
Device tree:= https://github.com/darran-kelinske-fivestars/android_device_lenovo_tb8504f/tree/lineage-15.1
Vendor tree:= https://github.com/darran-kelinske-fivestars/android_vendor_lenovo_tb8504f/tree/lineage-15.1
Kernel source:= https://github.com/darran-kelinske-fivestars/android_kernel_lenovo_tb8504f/tree/lineage-15.1
ROM Source:= https://github.com/LineageOS/android
Command:
source build/envsetup.sh && brunch tb8504f
The issue was that I was missing definitions in the kernel uapi includes. Once I added these definitions, I was able to get passed the build issue. I had imported a kernel from Lenovo that did not include the definitions that the xiami kernel had.
https://github.com/redmidevs/android_kernel_xiaomi_msm8917/commit/b33b025abaf5213ccfe1b5e17f75785163eb696a
#define SND_AUDIOCODEC_DSD ((__u32) 0x00000021)
#define SND_AUDIOCODEC_MAX SND_AUDIOCODEC_DSD
and
https://github.com/redmidevs/android_kernel_xiaomi_msm8917/commit/ae0ff772885768103d03ea01c9084990938f15a5
struct snd_dec_aptx {
__u32 lap;
__u32 uap;
__u32 nap;
};
I'm a newbie to c++ web programming. I followed the link tutorialspoint for C++ web programming.
http://www.tutorialspoint.com/cplusplus/cpp_web_programming.htm
I installed the cgicc library, confirgures it but will making i get the following error: I need to usecgicc libraries to make my html work.
Making all in cgicc
make[1]: Entering directory '/path/to/cgicc-3.0.2/cgicc'
/bin/sh ../libtool --mode=compile c++ -DHAVE_CONFIG_H -I. -I. -I. -I.. -g -O2 -c CgiEnvironment.cc
mkdir .libs
c++ -DHAVE_CONFIG_H -I. -I. -I. -I.. -g -O2 -c -fPIC -DPIC CgiEnvironment.cc -o .libs/CgiEnvironment.lo
c++ -DHAVE_CONFIG_H -I. -I. -I. -I.. -g -O2 -c CgiEnvironment.cc -o CgiEnvironment.o >/dev/null 2>&1
mv -f .libs/CgiEnvironment.lo CgiEnvironment.lo
/bin/sh ../libtool --mode=compile c++ -DHAVE_CONFIG_H -I. -I. -I. -I.. -g -O2 -c CgiUtils.cc
rm -f .libs/CgiUtils.lo
c++ -DHAVE_CONFIG_H -I. -I. -I. -I.. -g -O2 -c -fPIC -DPIC CgiUtils.cc -o .libs/CgiUtils.lo
CgiUtils.cc:111:30: error: 'string' does not name a type
CGICCNS unescapeString(const string& src)
^
CgiUtils.cc:111:41: error: 'std::__cxx11::string cgicc::unescapeString(const int&)' should have been declared inside 'cgicc'
CGICCNS unescapeString(const string& src)
^
CgiUtils.cc: In function 'std::__cxx11::string cgicc::unescapeString(const int&)':
CgiUtils.cc:117:18: error: request for member 'begin' in 'src', which is of non-class type 'const int'
for(iter = src.begin(); iter != src.end(); ++iter) {
^
CgiUtils.cc:117:39: error: request for member 'end' in 'src', which is of non-class type 'const int'
for(iter = src.begin(); iter != src.end(); ++iter) {
^
Makefile:229: recipe for target 'CgiUtils.lo' failed
make[1]: * [CgiUtils.lo] Error 1
make[1]: Leaving directory '/path/to/cgicc-3.0.2/cgicc'
Makefile:161: recipe for target 'all-recursive' failed
make: * [all-recursive] Error 1
Please tell me where I'm going wrong! Is there anything else i need to do
I am building flex-2.5.39 which I configured using:
./configure --enable-static LDFLAGS=-static CC=/x86_64-linux-musl/bin/x86_64-linux-musl-gcc
But at the very end, libtool is not linking statically. It is, in fact, simply discarding the flag:
[ root#836843e09b55:/flex-2.5.39 ]$ make flex
/bin/bash ./libtool --tag=CC --mode=link /x86_64-linux-musl/bin/x86_64-linux-musl-gcc -g -O2 -static -o flex ccl.o dfa.o ecs.o scanflags.o gen.o main.o misc.o nfa.o parse.o scan.o skel.o sym.o tblcmp.o yylex.o options.o scanopt.o buf.o tables.o tables_shared.o filter.o regex.o lib/libcompat.la -lm
libtool: link: /x86_64-linux-musl/bin/x86_64-linux-musl-gcc -g -O2 -o flex ccl.o dfa.o ecs.o scanflags.o gen.o main.o misc.o nfa.o parse.o scan.o skel.o sym.o tblcmp.o yylex.o options.o scanopt.o buf.o tables.o tables_shared.o filter.o regex.o lib/.libs/libcompat.a -lm
[ root#836843e09b55:/flex-2.5.39 ]$
How can I make libtool accept the flag and pass it on?
Using --static (extra minus), it works.
I have a makefile that I want to be able to execute after updating it.
EXE = sensor log
LDIR = lib
CC = gcc
CFLAGS = -Wall -c $(DEFINES)
LFLAGS = -Wall -L./$(LDIR) -Wl,-rpath=./$(LDIR)
CDFLAGS = -Wall -c -fPIC
LDFLAGS = -Wall -shared
DEFINES = -D SET_ID=20
.SUFFIXES:
all: sensor log
debug: DEFINES += -DDEBUG
debug: all
$(EXE) : % : %.o $(LDIR)/liblist.so $(LDIR)/libtcpsocket.so
#echo "\n***** LINKING $< *****"
$(CC) $(LFLAGS) $< -llist -ltcpsocket -lpthread -lm -o $#
liblist libmyqueue libtcpsocket libsensor_db : % : $(LDIR)/%.so
%.o : %.c %.check
#echo "\n***** COMPILING $< *****"
$(CC) $(CFLAGS) -o$# $<
$(LDIR)/lib%.so : %.c %.check
$(eval name = $(basename $<))
#echo "\n***** COMPILING LIB $< *****"
$(CC) $(CDFLAGS) $<
mkdir -p $(LDIR)
#echo "\n***** LINKING LIB $< *****"
$(CC) $(LDFLAGS) $(name).o -o $(LDIR)/lib$(name).so
.PHONY : clean clean-all *.check
%.check : %.c
#echo "\n***** CPPCHECK $< *****"
cppcheck --enable=all $^
clean:
rm -f *.o $(EXE) *~
clean-all: clean
rm -rf $(LDIR)
The issue is that I want to be able to compile with a parameter DEBUG or not (just an example). However, since the files haven't been changed itself between last compilation, make just tells me there is nothing to be done. How can I solve this?
Also, when compiling in the command line for a mysql file, I normally use $(mysql_config --cflags --libs) to compile it. However, doing this in the makefile causes it to turn green. How do I do this?
For the DEBUG parameter, to easiest way is to add a parameter in the command line. You can do this by adding the next lines before the first target:
ifeq ($(DEBUG),1)
DEFINES += -DDEBUG
endif
And even this, to restrict the DEBUG parameter to the command line only:
ifeq ("$(origin DEBUG)", "command line")
ifeq ($(DEBUG),1)
DEFINES += -DDEBUG
endif
endif
And then you just have to do this to compile in debug mode:
$ make DEBUG=1
For the mysql thing, just use the shell command like that:
CFLAGS := -Wall -c $(DEFINES) $(shell mysql_config --cflags --libs)